2012-02-07 48 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 

希望这有助于...