對你來說可能是一個愚蠢的問題,我找不到一個好的問題,但問題是 - 我不明白,我要你向我解釋這個概念,這樣我才能理解,我會真的很感謝。
所以,問題是 - 首先,我想知道為什么這行代碼:
printf("address of wsklan[0] %p\n", &wsklan[0])
將列印不同的地址:
printf("address of wsklan[0][0] %p\n", &wsklan[0][0]);
我猜這是因為在第一種情況下,這是一個指標的地址,而在第二種情況下 - 一個 char 變數的地址。但是為什么地址不一樣呢?我以為 wsklan[0] 的地址是第一個字符的地址。
字串如何存盤在記憶體中?字串在記憶體中一個接一個嗎?所以如果我輸入'onetwo'和第二個字串'threefour',它會一個接一個嗎?
第二個問題 - 為什么我不能像這樣使用 puts 函式?:
puts(wsklan 1)
但我可以這樣使用嗎?
puts(wsklan[1])
完整代碼片段:
#include <stdio.h>
#include <string.h>
char *read(char *z, int amount);
int main(void){
char data[20][300];
char * wsklan[20];
read(data[0], 300);
read(data[1], 300);
wsklan[0] = data[0];
wsklan[1] = data[1];
printf("addres wsklan[0][0] %p\n", &wsklan[0][0]);
printf("addres wsklan[1][0] %p\n", &wsklan[1][0]);
puts(wsklan[0]);
puts(wsklan[1]);
putchar(*wsklan[1]);
return 0;
}
char *read(char *z, int amount){
char * res;
int i = 0;
res = fgets(z, amount, stdin);
if(res){
while(z[i] != '\n' && z[i] != '\0')
i ;
if(z[i] != '\n')
z[i] = '\0';
else
while(getchar() != '\n')
continue;
}
return res;
}
感謝您的理解并幫助我大致了解這個概念。該代碼片段來自 Stephen Prata 的 C 書,我對其稍作修改。
uj5u.com熱心網友回復:
假設宣告是char * wsklan[20];.
在運算式中&wsklan[0], ,[]優先于&,因此我們得到指標編號 0。然后&給出該指標的地址。由于它是陣列中的第一項,您可以假設它與&wsklan.
在運算式中,&wsklan[0][0]我們也得到指標編號 0,然后再次[]優先,&因此我們0在陣列中得到指標編號 0 指向的字符編號。然后&給出該單個字符的地址。哪個地址取決于您將指標指向的位置。它指向的地址與存盤指標本身的地址不同,這是完全合理的。(因為指向它自己地址的指標將毫無用處。)
第二個問題:wsklan[1]是否 100% 等價于*(wsklan 1). 所以它有一個不同的含義wsklan 1。由于該變數屬于“字符指標陣列”型別,因此在運算式中使用時,它會“衰減”為指向第一項的指標。那將是一個指向字符指標的指標,char**. 這不是 printf 所期望的 - 您必須首先將其取消參考為普通的char*。
uj5u.com熱心網友回復:
為了論證起見,讓我們假設以下內容:
sizeof(char)是 1(根據定義)sizeof(char *)是 4(例如在具有 32 位指標的系統上)char data[20][300]存盤在地址 10000(任意)char *wsklan[20]存盤在地址 20000(任意)
然后:
&wsklan[0]轉換為(char **)20000&wsklan[1]轉換為(char **)20004&wsklan[2]轉換為(char **)20008
注意:一元的
&優先級低于[],所以&wsklan[0]意味著&(wsklan[0])。
和:
data[0]并&data[0][0]轉換為(char *)10000data[1]并&data[1][0]轉換為(char *)10300data[2]并&data[2][0]轉換為(char *)10600
注:
&data[0][0]表示&((data[0])[0])。
后:
wsklan[0] = data[0];
wsklan[1] = data[1];
然后:
wsklan[0]并&wsklan[0][0]轉換為(char *)10000(與data[0]和相同&data[0][0])wsklan[1]并&wsklan[1][0]轉換為(char *)10300(與data[1]和相同&data[1][0])
比較&wsklan[0]并&wsklan[0][0]從上面總結:
&wsklan[0]轉換為(char **)20000&wsklan[0][0]轉換為(char *)10000(與 相同&data[0][0])
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/314965.html
下一篇:C 中的多維陣列和指標
