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