C语言 当我以下面的方式使用指针时,到底发生了什么?

llycmphe  于 2023-05-16  发布在  其他
关注(0)|答案(2)|浏览(79)
int * func()
{
    static int array[10];
    int i = 0;
    while(i<10){
        array[i] = i + 1;
        i++;
    }
    return array;
}

int main()
{
    int *pointerFunc;
    pointerFunc = func();

    for (int i = 0; i < 10; i++ ) {
      printf("*(pointerFunc[%d]) : %d\n", i, *(pointerFunc + i));
    }

    return 0;
}

我有一个创建数组的函数。在main中,我想打印数组中的每个元素。我使用了一个指针来“访问”函数中的数组。它确实是这样工作的,但我真的不明白为什么。准确地说,我想知道这里发生了什么(当然它会打印studd,但指针的事情......):printf("*(pointerFunc[%d]) : %d\n", i, *(pointerFunc + i));我不太明白:*(pointerFunc + i)它工作,但如何和为什么?它确实打印了数组的每个元素,但我没有得到它。指针“看到”的是什么?

yquaqz18

yquaqz181#

printf("*(pointerFunc[%d]) : %d\n", i, *(pointerFunc + i));

在这里,您使用指针算术来访问数组的每个元素。
表达式*(pointerFunc + i)i与存储在pointerFunc中的内存地址相加,然后解引用得到的内存地址以访问存储在该内存位置中的值。因为pointerFunc指向数组的第一个元素,所以*(pointerFunc + i)给出了数组的第i个元素中存储的值。
或者,你也可以使用数组下标运算符[]来访问使用指针变量的数组元素,如下所示:

printf("pointerFunc[%d] : %d\n", i, pointerFunc[i]);

这两个表达式是等效的,它们将给予存储在数组的第i个元素中的值。

kkbh8khc

kkbh8khc2#

pointerFunc(一个用词不当的位)被设置为func()的返回值,即func()中的&array[0]。因为array是静态的,所以它是持久的;分配给它的存储器在func()返回之后仍然是可访问的(相对于func(),一个自动数组,它将是UB)。然后主循环使用pointerFunc打印array[0]array[9]*(pointerFunc + i)相当于pointerFunc[i]。前者是pointerFunc[i]的实际计算方式,因此i[pointerFunc]也是等价的。不推荐,但有利于理解。

相关问题