数组变量是指向数组第一个元素的指针吗? [复制]

Posted

技术标签:

【中文标题】数组变量是指向数组第一个元素的指针吗? [复制]【英文标题】:Is the array variable a pointer, which points to the first element of an array? [duplicate] 【发布时间】:2022-01-12 18:39:36 【问题描述】:

我在互联网上读到这个数组变量指向数组的第一个元素。代码示例如下:

#include <stdio.h>
int main()

    int i,a[10];
    for ( i = 0; i <= 9; ++i )
    
        printf ("The address of the array element %d is = %p\n",i+1, &a[i]);
    
    
    printf ("The address of the &a is = %p\n", &a); 
    
    printf ("The address of &a[0] is = %p\n", &a[0] );
    
    printf ("The address of a is = %p", a);
    
    return 0;

根据网上资料:数组变量a和数组元素a[0]的地址相同,因为数组变量名a指向数组的第一个元素,即a[0]。我的问题是:

    数组变量 a 是指针吗,因为它指向数组的第一个元素?

    如果数组变量a是一个指针,那么指针a和变量a[0]的地址不应该是(a 指向的指针)不同? (这里我们得到相同的地址)

    如果数组变量a不是指针,那下面的代码该如何解释呢?

a[0] = *a
a[1] = *a+1
a[2] = *a+2
a[3] = *a+3
a[4] = *a+4
a[5] = *a+5

我想这是一个很长的问题,但请告诉我答案,因为我已经为此绞尽脑汁,现在我想用头撞墙。我也是堆栈溢出的新手。

【问题讨论】:

数组不是指针,但在某些情况下它衰减为指针。至于您的示例,它只是定义a[x]*(a+x) 相同的语法糖,而不管a 是数组还是指针。此外,x[a] 可以写成x 是整数,a 是数组或指针,与a[x] 相同。 好问题,但以前有人问过。这是一个可能的重复:Is an array name a pointer? 基本的C问题在这里已经回答了很多次了。使用搜索栏 - 它会节省你写这个问题的时间 数组和指针之间的关系是所有 C 语言中最基本和最重要的学习内容之一。不幸的是,它也可能是最令人困惑和最难学习的内容之一。像“一个数组是指向它的第一个元素的指针”这样的陈述,虽然是善意的并且很受欢迎,但不幸的是,在实际教育新学习者方面完全是灾难性的。无论您“在互联网上阅读”是什么页面,关闭该窗口并删除该链接并尝试忘记您在那里阅读的内容。 改为阅读:数组就是数组,指针就是指针。但是当你在表达式中使用数组时,比如f(array)x = array + 1,你需要数组的值,你得到的不是整个数组,你得到的是指向数组第一个元素的指针。那个新指针不是“数组”;当您尝试获取数组的值时,该新指针会喷出。 【参考方案1】:

数组不是指针。确保运行这个简单的程序

#include <stdio.h>

int main( void )

    int a[10];

    printf( "sizeof( a ) = %zu\n", sizeof( a ) );
    printf( "sizeof( &a[0] ) = %zu\n", sizeof( &a[0] ) );

它的输出可能看起来像

sizeof( a ) = 40
sizeof( &a[0] ) = 8

但是,在表达式中使用的数组指示符确实会隐式转换为指向其第一个元素的指针。

来自 C 标准(6.3.2.1 左值、数组和函数指示符)

3 除非它是 sizeof 运算符的操作数或一元 & 运算符,或者是用于初始化数组的字符串文字, 具有“类型数组”类型的表达式被转换为 类型为“pointer to type”的表达式,指向初始 数组对象的元素并且不是左值。如果数组对象 有注册存储类,行为未定义。

至于你的问题

如果数组变量a不是指针那么我们该如何解释 代码如下?

a[0] = *a
a[1] = *a+1
a[2] = *a+2
a[3] = *a+3
a[4] = *a+4
a[5] = *a+5

然后在阅读了 C 标准中提供的引用之后,很明显这个表达式 *a 中的数组指示符 a 被转换为指向其第一个元素的指针。那就是您实际上拥有*( &amp;a[0] ) 或只是a[0]。而上面的记录等价于

a[0] = a[0]
a[1] = a[0]+1
a[2] = a[0]+2
a[3] = a[0]+3
a[4] = a[0]+4
a[5] = a[0]+5

关于地址的问题,表达式&amp;a&amp;a[0] 具有相同的值,因为它是数组占用的第一个字节的地址值。但是表达式的类型是不同的。表达式&amp;a 的类型为int ( * )[10],表达式&amp;a[0] 的类型为int *

【讨论】:

从问题来看,OP刚刚开始学习C。C标准使用的语言肯定只会造成更多的混乱。顺便说一句,它是最常见的重复项之一 这不是 OP 所问的。

以上是关于数组变量是指向数组第一个元素的指针吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

获取指向 LLVM-IR 中数组第一个元素的指针

Golang Slice 总结

c#拷贝数组指针中的元素到变量中

数组指针是二级指针吗?请解释一下!谢谢!

数组名作函数参数时,实参与形参变量之间的数据传递是?

20145309信息安全系统设计基础第12周学习总结后篇