and*_*i99 2 c pointers pointer-arithmetic
指针存储指向值的存储器地址,因此指针包含的存储器地址与值的存储器地址相同.因此,向这两个内存地址添加1应该会产生相同的结果,这是不会发生的.为什么?这是代码
int main()
{
int ages[] = {23, 43, 12, 89, 2};
int *cur_ages = ages;
printf("\n&cur_ages=%p, &cur_ages+1=%p", &cur_ages, &cur_ages+1);
printf("\n&ages=%p, &ages+1=%p", &ages, &ages+1);
printf("\ncur_ages=%p, cur_ages+1=%p", cur_ages, cur_ages+1);
printf("\n*cur_ages=%d, *cur_ages+1=%d", *cur_ages, *(cur_ages+1));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是
&cur_ages=0x1ffff85f3d0, &cur_ages+1=0x1ffff85f3d8
&ages=0x1ffff85f3dc, &ages+1=0x1ffff85f3f0
cur_ages=0x1ffff85f3dc, cur_ages+1=0x1ffff85f3e0
*cur_ages=23, *cur_ages+1=43
Run Code Online (Sandbox Code Playgroud)
&age + 1不等于cur_ages + 1.为什么?
指针运算通过给定值乘以指向的类型的大小来增加指针的值.
所以当你这样做时:
&ages+1
Run Code Online (Sandbox Code Playgroud)
您获取ages
(类型int [5]
)的地址并添加sizeof(ages)
到指针值.假设sizeof(int)
为4,则将指针值加20.
同样,当你这样做时:
cur_ages+1
Run Code Online (Sandbox Code Playgroud)
在这里,cur_ages
指向a int
,所以添加1会增加sizeof(int)
指针值.