3

所以我有以下代码片段:

#include <stdio.h>

void pointer_shift(int *a, int n);

int main(void) {
    int a[] = {100, 101, 102};
    pointer_shift(a1, 3);
}

void pointer_shift(int *a, int n) {
    int i;
    for (i = 0; i != n - 1; i++) {
        *(a + i) = *(a + i + 1);
    }
}

我只是想澄清一下这个片段中的指针是如何工作的。所以pointer_shift接受'a',一个指向int的指针,对吗?a1 被传递给此参数,并且由于数组衰减为指向其第一个元素的指针,因此它可以工作。

首先,希望我在上一段中所说的是正确的。其次,*(a + i) = *(a + i + 1); 是什么意思?实际上呢?假设我们在 for 循环的第一次迭代中,并且 i = 0。那么左侧 *a 访问的究竟是什么?它代表一个指针吗?我认为 * 是取消引用运算符,并访问指针指向的对象......然后它设置 *a = *(a + 1)。(a + 1) 是数组中的下一个元素,但这个赋值究竟做了什么,为什么?

谢谢!

4

4 回答 4

2

它实际上不是指针移位,而是值移位,*(a+i)与 作用相同a[i],所以它的作用是a[i] = a[i+1]

于 2012-09-09T23:33:48.140 回答
0

*(a + i) = *(a + i + 1);正在使用一些指针算法复制数组中的数组元素。

*(a + i)等价于a[i],因此该语句等价于a[i] = a[i + 1];。循环将数组值在数组中“向左”移动:a[0] = a[1]; a[1] = a[2];等等。

您对函数调用的理解是正确的。

于 2012-09-09T23:31:54.477 回答
0

我只是想澄清一下这个片段中的指针是如何工作的。所以pointer_shift接受'a',一个指向int的指针,对吗?a1 被传递给此参数,并且由于数组衰减为指向其第一个元素的指针,因此它可以工作。

是的,当您将数组传递给函数时,它会降级为指针。数组不是对象意义上的指针,而是值意义上的指针。当您将它传递给函数时,它的值被传递,即指向第一个元素的指针。

数组索引与指针算法相同,因此此代码段中的最后两行是等效的:

int arr[] = {1, 2, 3};

arr[0] = 10;
*arr = 10;

这些是:

arr[1] = 20;
*(arr + 1) = 20;
于 2012-09-09T23:32:41.280 回答
0

表达式是指针运算,以指针大小为单位递增a + i存储的内存地址。因此,如果指向 an 的指针在您的系统上占用四个字节,并且如果当前内存地址是,比如说,值将是.aiaint0x1234a + 10x1238

星号所做的是取消引用该地址并访问该地址的实际值。如果您已100存储在aor a[0],并且101存储在a + 1or a[1],则*(a + i) = *(a + i + 1)替换100101at a[0],for i = 0

基本上,您想阅读有关指针和数组的 C 教程

于 2012-09-09T23:40:12.173 回答