(1)指针加减整数:一度很疑惑数据指针在同种机器和编译器下长度是相同的,但是不同类型指针加上同一个整数之后值却不一样。
int main(void)
{
int num;
char c ;
int * a = #
char* str= &c;
printf("%d\n", sizeof(void *));
printf("%d %d\n", sizeof(int *), sizeof(char *));
printf("%d %d\n", sizeof(a), sizeof(str));
printf("%x %x\n", a, str);
printf("%d %d\n", sizeof(*a), sizeof(*str) );
++a;
++str;
printf("%x %x\n", a, str);
return 0;
}
后来想通了,指针长度相同是存储的地址,需要同样的字节数来存储指针指向地址值。当指针加整数时目的一般是寻找指向的值而不是为了计算无用的地址值,应该是出于这种考量,c标准规定了给指针加上一个整数实际上加的数是这个整数和指针数据类型对应字节数的乘积。虽然规定为加整数就为地址加上实际的整数同样可以人为控制乘以数据类型对应字节数,但是可能这样一般并没有意义,出于简单目的,于是就有了这个顶。
减去整数同加法。
(2)两个指针相减:这样会得到两个地址的差值。通常这个差值没有什么用,但是一般可以用来判断数组中的元素顺序呢。应该出于这个用处的目的,指针差值规定为它们之间相差的“单位”数,即指向数据类型的单位数。实际计算为地址差值/sizeof(类型)。
以上的标准规定是准确的,一些想法是自己的理解,如果错了希望不要误导他人。