簡體   English   中英

在聲明指向數組的指針並傳遞給函數時,指針如何工作

[英]How do pointers work when declaring a pointer to an array and passing to function

好的,出於某種原因,我無法解決這個問題,但這是我到目前為止所知道或認為的。

如果要聲明char類型的數組,請使用char a[8][8] ,然后聲明char類型的指針:

char *p = a;

我知道,如果我在打印語句中引用a,我將得到第一行的地址-如果僅打印數組a,我仍將獲得相同的地址,因為數組a指向第一行。 現在,如果我打印p,我知道我將獲得a的地址,因為這就是指針變量的作用。

不管我是否做過:

char *p = &achar *p = achar *p = *a ,這是相同的-指向相同的地址。

當我決定打印出帶有偏差的變量p ,就會出現問題。 當我打印*p ,我得到a[0][0] 問題是,當我嘗試打印的尊重a ,我得到的第一行的地址再次,而不是值a[0][0]

這是否意味着當我創建指向數組的指針變量時,它會跳過指向數組的內容,而直接指向a的行? 含義:

[*p] = [**a]而不是[*p] = [*a]因為[char *p = *a] = [char *p = a]

因此,通過創建指針,它會跳過嗎? 我可能對此考慮過度,或者發現了我的大腦不願接受的規則或屬性。

編輯:我現在似乎從弗拉德的答案中了解了。 這很奇怪,因為在我為課堂上做學習題時,我被告知要在不使用[]作為練習的情況下進行這樣的函數,這就是我試圖避免這種方式的原因。

char a[3][8]表示您有

由8個字符組成的數組( 由3個成員組成 )。

你需要

char (*ptr)[8]=a; // Pointer to an array(of 3 members) of 8 characters

請注意,作為程序員,您需要注意不要訪問超出合法數組限制的范圍,即,因為計數從零開始,所以可以訪問的最大值為(*(ptr+2)) 即零到二等於三!

它可以表示為

(*ptr)[8]  // the pointer ptr points to
   V       // the first element of
arr[0][8]  // arr, ie arr[0]

由於C指針支持數組的解引用,因此您可以

ptr[0][1] which is the same as (*(ptr+0))[1]

相似地

ptr[2][7] which is the same as (*(ptr+2))[7] 
//note [2][7] is the maximum bound  for legal access

最后,什么是問題

char *ptr=a;

使用char *ptr可以得到一個指針。 是的 那是對的。 當您考慮*ptra兼容性時,就會出現問題。 a具有char[8]類型。 但只有char *ptr=a ,你是不是占[8]在部分a 當您選擇size時,差異會變得很明顯

char a[3][8];
char (*ptr)[8]=a;
char *ptr1=a; // A good compiler will warn you about this line.
printf("ptr : %zd\n",sizeof *ptr);
printf("ptr1 : %zd\n",sizeof *ptr1);

給我

ptr : 8 // accounts for eight characters. Here ptr covers the entire
block of eight charactes, so that if you need to go to the next block
of eight characters you could just do "ptr+1" or "ptr[1]
ptr1 : 1 // accounts for just one character.

如果您有這樣的數組聲明

char a[8][8];

然后這個宣言

char *p = a;

是無效的。

正如您在表達式中正確指出的那樣,帶有罕見異常的二維數組指示符將轉換為指向其第一行的指針。 因此,用作初始化程序的變量a將轉換為char ( * )[8]類型的rvalue char *char ( * )[8]類型的指針不兼容。 它們指向不同類型的對象。 第一個指向類型為char對象,第二個指向類型為char[8]對象。

至於地址,則數組是存儲范圍。 因此,數組本身或其第一行或第一行中第一個元素的地址彼此相等,因為它們都是數組所占用內存范圍的地址。

您可以將二維數組解釋為一維數組。 例如

char *p = ( char * )a;

當然,在這種情況下,您只能將下標運算符一次應用於指針。 數組范圍將被視為由char[ 8 * 8 ]類型的一維數組char[64]占用的內存。 但是,如果原始數組的每一行都包含一個字符串,則可能會出現問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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