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)
它工作,但如何和为什么?它确实打印了数组的每个元素,但我没有得到它。指针“看到”的是什么?
2条答案
按热度按时间yquaqz181#
在这里,您使用指针算术来访问数组的每个元素。
表达式
*(pointerFunc + i)
将i
与存储在pointerFunc
中的内存地址相加,然后解引用得到的内存地址以访问存储在该内存位置中的值。因为pointerFunc
指向数组的第一个元素,所以*(pointerFunc + i)
给出了数组的第i
个元素中存储的值。或者,你也可以使用数组下标运算符
[]
来访问使用指针变量的数组元素,如下所示:这两个表达式是等效的,它们将给予存储在数组的第
i
个元素中的值。kkbh8khc2#
pointerFunc
(一个用词不当的位)被设置为func()
的返回值,即func()
中的&array[0]
。因为array
是静态的,所以它是持久的;分配给它的存储器在func()
返回之后仍然是可访问的(相对于func()
,一个自动数组,它将是UB)。然后主循环使用pointerFunc
打印array[0]
到array[9]
。*(pointerFunc + i)
相当于pointerFunc[i]
。前者是pointerFunc[i]
的实际计算方式,因此i[pointerFunc]
也是等价的。不推荐,但有利于理解。