[英]Difference between char[] and char* in function call
我發現自己無法解釋以下代碼為何起作用。 不用說,我對C ++還是很陌生。
#include <cstdio>
void foo(char* p)
{
p[0] = 'y';
}
int main()
{
char a[1];
a[0] = 'x';
printf("a[0] = %c\n", a[0]);
foo(a);
printf("a[0] = %c\n", a[0]);
return 0;
}
該程序輸出
a[0] = x
a[0] = y
令我着迷的是,我沒有將指針傳遞給foo,而是將數組傳遞給了foo。 那么foo如何改變數組a的值呢? 這僅適用於char數組嗎?
char和char [1]之間的區別的答案證實了我的觀察,但並未詳細說明為什么會這樣。
謝謝!
在C語言中,在大多數情況下(*),數組都會衰減為指向其第一個元素的指針。
在您的情況下,數組a
衰減為指向a[0]
的指針。
數組int arr[12][23]
僅由其標識符使用時,會衰減為其第一個元素的指針arr[0]
,其類型為int (*)[23]
(指向23的數組的指針)整數)。
(*)用作sizeof
運算符的參數,用作&
運算符的參數或用作字符數組的初始化程序(字符串文字)時,數組不會衰減。
當你說
char a[5];
編譯器分配5個連續的內存塊,並且第一個塊的地址分配給a。 因此,根據定義,數組的名稱(在我們的例子中為a)只是指向內存位置的指針。
現在,當我們說a [0]時,編譯器將其處理為*(a + 0 * sizeof(數組數據類型,即char,int等。)),符號地將a [i]表示為*(a + i * sizeof(array數據類型即char,int等))
就函數參數傳遞而言,當我們將數組傳遞給函數時,基本上只是傳遞的第一個元素的地址。 有關此plz的更多詳細信息,請單擊此鏈接或閱讀@cnicutar的答案(由於他已經發布了正確的答案,因此沒有必要再重復一次)...
您可以嘗試這樣做以說服自己如何工作。
int a[8], *p;
p = a;
printf("%p, %p, %p\n", a, &a[0], p);
數組無非是一個指針(指向第一個元素),至少是為了傳遞參數。
這里的三個原型是等效的:
void foo(char *p);
void foo(char p[]);
void foo(char p[42]);
Ç說的類型陣列的參數的聲明T
調節到類型的指針到一個聲明T
。
數組名稱指向數組第一個元素的地址。 請參閱: 數組名稱是指針嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.