考虑:
void print_array(int(*p)[10], int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ", (*p)[i]);
}
}
int main()
{
int arr[10] = { 0 };
int len = sizeof(arr) / sizeof(int);
for (int i = 0; i < len; i++)
{
arr[i] = i;
}
int(*p)[10] = arr;
print_array(p, len);
return 0;
}
为什么 print_array 函数的代码可以打印数组的信息?
我没有实现的代码,(*p)[i]
,所以我想程序员大师可以帮助我解决这个问题。
我想我不理解这段代码的原因是我没有意识到数组指针的知识。
3条答案
按热度按时间jljoyd4f1#
让我们从这条线开始
用作初始化器的数组
arr
被隐式转换为指向其第一个int *
类型元素的指针。然而,初始化的指针
p
具有int ( * )[10]
类型,并且这两个指针之间没有隐式转换。所以编译器至少应该发出一个警告。
你得写
另一方面,表达式
arr
和&arr
的值彼此相等。它是数组占用的内存范围的初始地址。(数组的第一个元素的地址等于整个对象的数组的地址)。因此,该函数接受指向数组的
int ( * )[10]
类型的指针。解引用表达式
(*p)
中的指针,您将得到一个类型为int[10]
(指针指向的数组)的对象,该对象是数组类型的对象。因此,您可以应用下标操作符
(*p)[i]
来访问数组的元素。qacovj5a2#
p
是指向10个元素的int
数组的指针。(*p)[i]
首先,解引用指针p
,得到10个整数的数组。然后访问数组的第i
个元素。9w11ddsr3#
数组是一个连续的内存分配,因此语句
int(*p)[10] = arr;
创建了一个指针数组,其中p[0]指向数组的第一个元素。现在在函数调用中,*p[i]导致 *(p + i)。它不断递增,因此它将继续打印数组元素1st,2nd,3rd等等。