我如何解释C中数组的指针?

s4n0splo  于 2023-05-16  发布在  其他
关注(0)|答案(3)|浏览(123)

考虑:

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],所以我想程序员大师可以帮助我解决这个问题。
我想我不理解这段代码的原因是我没有意识到数组指针的知识。

jljoyd4f

jljoyd4f1#

让我们从这条线开始

int(*p)[10] = arr;

用作初始化器的数组arr被隐式转换为指向其第一个int *类型元素的指针。
然而,初始化的指针p具有int ( * )[10]类型,并且这两个指针之间没有隐式转换。
所以编译器至少应该发出一个警告。
你得写

int(*p)[10] = &arr;

另一方面,表达式arr&arr的值彼此相等。它是数组占用的内存范围的初始地址。(数组的第一个元素的地址等于整个对象的数组的地址)。
因此,该函数接受指向数组的int ( * )[10]类型的指针。
解引用表达式(*p)中的指针,您将得到一个类型为int[10](指针指向的数组)的对象,该对象是数组类型的对象。
因此,您可以应用下标操作符(*p)[i]来访问数组的元素。

qacovj5a

qacovj5a2#

p是指向10个元素的int数组的指针。
(*p)[i]首先,解引用指针p,得到10个整数的数组。然后访问数组的第i个元素。

9w11ddsr

9w11ddsr3#

数组是一个连续的内存分配,因此语句int(*p)[10] = arr;创建了一个指针数组,其中p[0]指向数组的第一个元素。
现在在函数调用中,*p[i]导致 *(p + i)。它不断递增,因此它将继续打印数组元素1st,2nd,3rd等等。

相关问题