2012-02-07 20 views
3

此代碼:不與FUNC printf的理解用C

char arr1[20] = "fedcba"; 
char *ptr; 

ptr = &arr1[2]; 
puts(arr1); 
printf("%d\n",*arr1 - *ptr); 
printf("%d\n",arr1 - ptr); 

據我所知,第一次印刷放字符串。

printf我 - 應該打印什麼?它說* arr1 - * ptr?

printf II - one和two有什麼不同?

+0

你怎麼_want_打印? – 2012-02-07 09:57:02

+0

你明白'* arr1'是什麼意思? – Donotalo 2012-02-07 09:57:06

回答

3

第一打印2個char S之間的差:

第二打印2個指針之間的差。

*arr1 dereferences a char*並返回第一個字符,即'f'

ptr = &arr1[2];將使ptr指向"dcba"。它採用arr1中第三個字符的地址。 *ptr返回'd'

因此,第一個printf返回字符fd之間的差值 - 即2

第二個是兩個指針的區別。這是合法的,因爲它們都指向同一個字符數組。這與arr1 - &arr[2]相同,它很可能是-2,因爲數組連續存儲在內存中。

+0

@他們確實指向同一個數組。 – 2012-02-07 10:02:04

+0

謝謝,非常明確的解釋! – engc 2012-02-07 10:17:59

+0

優秀的答案 – 2012-02-07 10:23:09

1
printf("%d\n",*arr1 - *ptr); 

這將打印的arr1第一個字符減去ptr的第一個字符的結果。 下面是清晰的版本做同樣的事情:printf("%d\n",arr1[0] - ptr[0]);


printf("%d\n",arr1 - ptr); 

這將打印arr1ptr之間的差別的指針,這是2

本質屬性認爲:(a[x] - a)相當於x

+0

ptr指向arr1中的第三個字符,所以第二個printf的行爲不是未定義的! – 2012-02-07 09:59:55

+0

@ammoQ哦,對了,arr2讓我困惑。 – Pubby 2012-02-07 10:02:03

0

只需將這兩行添加到您的程序中以便更好地理解...

printf("\n%d AND %d... %c",arr1, *arr1, *arr1); 
printf("\n%d AND %d... %c",ptr, *ptr, ptr[0]); //ptr[0] == *ptr 

希望這有助於...