第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么C和C ++編譯器在從未強(qiáng)制實(shí)施時(shí)允許函數(shù)簽名中的數(shù)組長(zhǎng)度?

為什么C和C ++編譯器在從未強(qiáng)制實(shí)施時(shí)允許函數(shù)簽名中的數(shù)組長(zhǎng)度?

C++ C
牧羊人nacy 2019-07-23 10:53:23
為什么C和C ++編譯器在從未強(qiáng)制實(shí)施時(shí)允許函數(shù)簽名中的數(shù)組長(zhǎng)度?這是我在學(xué)習(xí)期間發(fā)現(xiàn)的:#include<iostream>using namespace std;int dis(char a[1]){     int length = strlen(a);     char c = a[2];     return length;}int main(){     char b[4] = "abc";     int c = dis(b);     cout << c;     return 0;}所以在變量中int dis(char a[1]),[1]似乎什么都不做,根本不起作用,因?yàn)槲铱梢允褂胊[2]。就像int a[]或char *a。我知道數(shù)組名稱是一個(gè)指針,以及如何傳達(dá)一個(gè)數(shù)組,所以我的謎題不是這個(gè)部分。我想知道的是為什么編譯器允許這種行為(int a[1])?;蛘咚衅渌也恢赖暮x?
查看完整描述

3 回答

?
12345678_0001

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊

這是將數(shù)組傳遞給函數(shù)的語(yǔ)法的怪癖。

實(shí)際上,無法在C中傳遞數(shù)組。如果您編寫的語(yǔ)法看起來應(yīng)該通過數(shù)組,那么實(shí)際發(fā)生的是傳遞指向數(shù)組第一個(gè)元素的指針。

由于指針不包含任何長(zhǎng)度信息,因此[]實(shí)際上忽略了函數(shù)形式參數(shù)列表中的內(nèi)容。

允許這種語(yǔ)法的決定是在20世紀(jì)70年代做出的,并且自從......以來引起了很大的混亂。


查看完整回答
反對(duì) 回復(fù) 2019-07-23
?
慕桂英4014372

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超13個(gè)贊

忽略第一個(gè)維度的長(zhǎng)度,但需要額外維度的長(zhǎng)度以允許編譯器正確計(jì)算偏移量。在下面的示例中,foo函數(shù)傳遞指向二維數(shù)組的指針。

#include <stdio.h>void foo(int args[10][20]){
    printf("%zd\n", sizeof(args[0]));}int main(int argc, char **argv){
    int a[2][20];
    foo(a);
    return 0;}

[10]忽略第一個(gè)維度的大小; 編譯器不會(huì)阻止你索引結(jié)束(請(qǐng)注意,正式需要10個(gè)元素,但實(shí)際只提供2個(gè)元素)。但是,第二個(gè)維度的大小[20]用于確定每一行的步幅,這里,形式必須與實(shí)際匹配。同樣,編譯器也不會(huì)阻止您索引第二個(gè)維度的末尾。

從數(shù)組基址到元素的字節(jié)偏移量由下式args[row][col]確定:

sizeof(int)*(col + 20*row)

請(qǐng)注意,如果col >= 20,那么您將實(shí)際索引到后續(xù)行(或整個(gè)數(shù)組的末尾)。

sizeof(args[0]),80在我的機(jī)器上返回sizeof(int) == 4。但是,如果我嘗試接受sizeof(args),我會(huì)得到以下編譯器警告:

foo.c:5:27: warning: sizeof on array function parameter will return size of 'int (*)[20]' instead of 'int [10][20]' [-Wsizeof-array-argument]
    printf("%zd\n", sizeof(args));
                          ^foo.c:3:14: note: declared herevoid foo(int args[10][20])
             ^1 warning generated.

在這里,編譯器警告它只會(huì)給出數(shù)組已經(jīng)衰減的指針的大小而不是數(shù)組本身的大小


查看完整回答
反對(duì) 回復(fù) 2019-07-23
  • 3 回答
  • 0 關(guān)注
  • 854 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)