陣列名作為函式引數以及sizeof用法

2021-09-01 11:27:51 字數 894 閱讀 7625

int f(int *p,char *a)

int main()

; char a[9]=;

printf("sizeof(p)=%d\n",sizeof(p));

printf("sizeof(a)=%d\n",sizeof(a));

f(p,a);

return 0;

}

輸出結果為:

sizeof(p)=20          //5*4 int佔四個位元組

sizeof(a)=9 //char佔1個位元組

p[2]=2,*(p+2)=2

a[2]=2,*(p+2)=2

sizeof(p)=4 //指標佔4個位元組

sizeof(a)=4 //指標佔4個位元組

在《c陷阱和缺陷》中有兩句話:

1.如果我們使用陣列名作為函式引數,那麼陣列名會立刻轉換為指向該陣列第乙個元素的指標。c語言會自動的降作為引數的陣列宣告轉換為相應的指標宣告。

2.除了a被用作運算子sizeof的引數這一情形,在其他所有的情形中陣列名a都代表指向陣列a中下標為0的元素的指標。

如下**中,把陣列作為函式引數時,函式中需要計算陣列大小:

void copy(int a,int b)

這段**的本意是將a中的所有字元拷貝到b中,但執行時會發現不能得到正確結果。因為當陣列作為形參時,在函式內退化為指標,因此sizeof(a)返回的是指標的大小,而不是陣列a的大小。正確的做法將陣列的引用作為引數:

void copy(int (&a),int b)

陣列名作為函式引數以及sizeof用法

int f int p,char a int main char a 9 printf sizeof p d n sizeof p printf sizeof a d n sizeof a f p,a return 0 輸出結果為 sizeof p 20 5 4 int佔四個位元組 sizeof a...

使用陣列名作為函式引數

主函式中初始化乙個二維陣列,表示乙個矩陣,矩陣,並將每個元素都輸出,然後呼叫子 函式,分別計算每一行的元素之和,將和直接存放在每行的第乙個元素中,返回主函式之 後輸出各行元素的和。include using namespace std void rowsum int a 4 int nrow int...

陣列名作為函式引數時,退化為指標

陣列名作為函式引數時,退化為指標 func char str 100 函式中陣列名作為函式形參時,在函式體內,陣列名失去了本身的內涵,僅僅只是乙個指標 在失去其內涵的同時,它還失去了其常量特性,可以作自增 自減等操作,可以被修改。陣列作為引數傳給函式時傳的是指標而不是陣列,傳遞的是陣列的首位址 在c...