2017-09-27 75 views
1
#include<stdio.h> 
#include<string.h> 

int main() 
{ 
char arr[3][10]; 
char *ptr[3]; 
strcpy(arr[1],"abcde"); 
ptr[1]=arr[1]; 
printf("%s\n",arr[1]); 
printf("%p\n", &arr[1]); 
printf("%p\n", ptr[1]); 
printf("%p\n", &ptr[1]); 
printf("%s\n",ptr[1]); 
printf("%s\n", *(ptr+1)); 
return 0; 
} 

結果指針在指針值打印的陣列而不*

abcde 
0x7ffdcbbd8daa 
0x7ffdcbbd8daa 
0x7ffc30ed1188 
abcde 
abcde 

我知道ptr是指針的陣列。解引用指針需要一個一元運算符。爲什麼我們可以取消引用ptr[1]而不用*?謝謝

+0

你能否詳細說明你的問題和你的問題?你的意思是(錯誤類型)行'printf(「%s \ n」)ptr [1]);'? (將來,***複製粘貼***代碼而不是將其重寫到問題中) –

+1

另請注意,'arr [1]'和'&arr [1]'可能指向相同的位置,但他們是不同的。 'arr [1]'等於'char *'類型的'&arr [1] [0]'。 '&arr [1]'的類型是char(*)[10]'。 –

+1

您不是解除引用,printf()需要一個指向「%s」字符串的指針。你正在給ptr指針[1]。 – MayurK

回答

1

%s在printf期望中的說明符和類型爲char *的參數(它應該指向以空字符結尾的字符串)。 ptr[1]char *類型。所以,不需要在這裏應用解引用操作符。

0

你說錯了。在這裏:

printf("%s\n", ptr[1]); 
  • 格式%s需要一個指向char
  • ptr[1]是一個char指針。

爲什麼我用*(PTR + 1)它打印相同的值?

因爲這將適用指針算術,其中涉及ptr,把它加1(一個在這裏我們指的int的大小),然後使用*運營商,並參考該內存地址的內容(它指向的),這與ptr[1]的值相同。


arr[1]&arr[1]可能會指向同一個位置,但語義上它們是不同的。 arr[1]等於&arr[1][0],其類型爲char*&arr[1]是類型char (*)[10],正如一些程序員哥們所說。

+0

所以爲什麼我使用*(ptr + 1)它會輸出相同的值 –

+0

「您不是解除引用。」 - >使用'ptr [1]'看起來像代碼_is_在偏移1處去引用'ptr'。當然這會產生一個'char *',這不需要用''%的「'。 – chux

+0

因爲最終結果是相同的值@QuocAnhPham,請檢查我更新的答案,希望對您有所幫助!順便說一句,你有兩個有用的答案,考慮*接受*通過點擊答案左側的刻度線。 – gsamaras