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有什麼不同?
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有什麼不同?
第一打印2個char
S之間的差:
第二打印2個指針之間的差。
*arr1
dereferences a char*
並返回第一個字符,即'f'
。
ptr = &arr1[2];
將使ptr
指向"dcba"
。它採用arr1
中第三個字符的地址。 *ptr
返回'd'
。
因此,第一個printf
返回字符f
和d
之間的差值 - 即2
。
第二個是兩個指針的區別。這是合法的,因爲它們都指向同一個字符數組。這與arr1 - &arr[2]
相同,它很可能是-2
,因爲數組連續存儲在內存中。
@他們確實指向同一個數組。 – 2012-02-07 10:02:04
謝謝,非常明確的解釋! – engc 2012-02-07 10:17:59
優秀的答案 – 2012-02-07 10:23:09
printf("%d\n",*arr1 - *ptr);
這將打印的arr1
第一個字符減去ptr
的第一個字符的結果。 下面是清晰的版本做同樣的事情:printf("%d\n",arr1[0] - ptr[0]);
printf("%d\n",arr1 - ptr);
這將打印arr1
和ptr
之間的差別的指針,這是2
本質屬性認爲:(a[x] - a)
相當於x
ptr指向arr1中的第三個字符,所以第二個printf的行爲不是未定義的! – 2012-02-07 09:59:55
@ammoQ哦,對了,arr2讓我困惑。 – Pubby 2012-02-07 10:02:03
只需將這兩行添加到您的程序中以便更好地理解...
printf("\n%d AND %d... %c",arr1, *arr1, *arr1);
printf("\n%d AND %d... %c",ptr, *ptr, ptr[0]); //ptr[0] == *ptr
希望這有助於...
你怎麼_want_打印? – 2012-02-07 09:57:02
你明白'* arr1'是什麼意思? – Donotalo 2012-02-07 09:57:06