请有人向我解释一下这种奇怪的指针行为。我是不是错过了什么?!?
///////////////////////开始第一次尝试
int *foo=(int*)malloc(sizeof(int)*4);//allocates memory for 4 integer with size of sizeof(int) foo points to the address of the first element- foo=&foo[0]
for (int i = 0; i < 4; i++)
{
*foo=i+1;
foo++;
printf("foo[%d] :%d \n",i,foo[i]);
}
Otput 是这样的
foo[0] :0
foo[1] :0
foo[2] :0
foo[3] :0
/////////////////////// 结束第一次尝试
让我们在代码中添加一件小事:
////////////////////// start second attempt
int *foo=(int*)malloc(sizeof(int)*4);//same as first attempt
int* ptr=foo;//???????????????????? why this is necessary?
printf("Value of foo: %d value of ptr is: %d &foo[0] %d\n",foo,ptr, &foo[0]);
for (int i = 0; i < 4; i++)
{
*ptr=i+1;//assign and update via ptr
ptr++;
printf("foo[%d] :%d \n",i,foo[i]);
}
输出
Value of foo: 1322628816 value of ptr is: 1322628816 &foo[0] 1322628816
foo[0] :1
foo[1] :2
foo[2] :3
foo[3] :4
/////////////////////// 结束第二次尝试
注意:我使用 Ubuntu 18.04、gcc (Ubuntu 11.4.0-2ubuntu1\~18.04) 11.4.0 和 GNU C Library (Ubuntu GLIBC 2.27-3ubuntu1.6) 稳定发行版本 2.27
我尝试了上面写的方法
执行
foo++
之后,foo
不再指向数组的开头,而是指向数组的第i+1
元素。然后当您尝试访问 foo[i]
时,您正在访问元素 i
将 after 第 i
个元素,即 original_foo[i+1+i]
。
它适用于第二个版本,因为您正在索引的变量不是您正在递增的变量。所以
foo
继续指向数组的开头,而foo[i]
就是你刚刚分配的元素。