C 中指针算术的奇怪行为

问题描述 投票:0回答:1

请有人向我解释一下这种奇怪的指针行为。我是不是错过了什么?!?

///////////////////////开始第一次尝试

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

我尝试了上面写的方法

c pointers
1个回答
0
投票

执行

foo++
之后,
foo
不再指向数组的开头,而是指向数组的第
i+1
元素。然后当您尝试访问
foo[i]
时,您正在访问元素
i
after
i
个元素,即
original_foo[i+1+i]

它适用于第二个版本,因为您正在索引的变量不是您正在递增的变量。所以

foo
继续指向数组的开头,而
foo[i]
就是你刚刚分配的元素。

© www.soinside.com 2019 - 2024. All rights reserved.