簡體   English   中英

函數調用中char []和char *之間的區別

[英]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]之間的區別的答案證實了我的觀察,但並未詳細說明為什么會這樣。

謝謝!

當您將數組傳遞給函數時,它會衰減為指向第一個元素的指針。

以下是完全等效的:

void foo(char* p);
void foo(char p[]);
void foo(char p[42]); /* Or any other number. */ 

這僅適用於char數組嗎?

它適用於任何數組。 我推薦C FAQaryptr部分

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM