下面的例子可以帮助理解不同类型指针的区别:
#include <stdio.h>
int main()
{
// Pointer to char
char * cp = "Abcdefghijk";
// Pointer to int
int * ip = (int *)cp; // To the same address
// Try address arithmetic
printf("Test of char*:\n");
printf("address %p contains data %c\n", cp, *cp);
printf("address %p contains data %c\n", (cp+1), *(cp+1));
printf("Test of int*:\n");
printf("address %p contains data %c\n", ip, *ip);
printf("address %p contains data %c\n", (ip + 1), *(ip + 1));
return 0;
}
输出是:
重要的是要了解address+1 表达式根据address 类型给出不同的结果,即+1 表示sizeof(addressed data),如sizeof(*address)。
因此,如果在您的系统中(对于您的编译器)sizeof(int) 和 sizeof(char) 不同(例如,4 和 1),cp+1 和 ip+1 的结果也不同。在我的系统中是:
E05859(hex) - E05858(hex) = 14702684(dec) - 14702681(dec) = 1 byte for char
E0585C(hex) - E05858(hex) = 14702684(dec) - 14702680(dec) = 4 bytes for int
注意:在这种情况下,具体的地址值并不重要。唯一的区别是指针持有的变量类型,这显然很重要。
更新:
顺便说一下,地址(指针)算术不受+1或++的限制,所以可以举很多例子,比如:
int arr[] = { 1, 2, 3, 4, 5, 6 };
int *p1 = &arr[1];
int *p4 = &arr[4];
printf("Distance between %d and %d is %d\n", *p1, *p4, p4 - p1);
printf("But addresses are %p and %p have absolute difference in %d\n", p1, p4, int(p4) - int(p1));
有输出:
所以,为了更好地理解,请阅读the tutorial。