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...