c - c中的数组名到底是什么?

标签 c arrays pointers memory-address

我很难理解 C 中数组名称的类型和使用。这可能看起来很长,但请耐心等待。

据我了解,以下语句将 a 声明为 int [] 类型,即整数数组

int a[30];

虽然a也指向数组的第一个元素,并且*(a+2)之类的东西是有效的。因此,使 a 看起来像一个指向整数的指针。但实际上 int []int* 类型是不同的;前者是数组类型,后者是指向整数的指针

此外,当将 int [] 类型的变量传递给函数时,该变量也会转换为 int* 类型的变量;与 C 中一样,数组通过引用传递(sizeof 运算符除外)。

让我困惑的地方来了。看一下下面的代码:

int main()
{
    int (*p)[3];
    int a[3] = { 5, 4, 6 };

    p = &a;

    printf("a:%d\t&a:%d\n",a,&a);
    printf("%d",*(*p + 2));
}

输出:

a:2686720       &a:2686720
6

那么,上面的代码是如何工作的呢?我有两个问题:

  1. a&a 具有相同的值。为什么?
  2. int (*p)[3]; 到底是做什么的?它声明了一个指向数组的指针,我知道这一点。但是指向数组的指针指向数组第一个元素的指针数组名称有何不同?

谁能澄清一下吗?我有很多困惑。

我知道我应该使用 %p 作为占位符,而不是使用 %d 来打印指针变量的值。因为使用整数占位符可能会打印截断的地址。但我只是想让事情变得简单。

最佳答案

其他答案已经解释了这个问题。我试图用一些图表来解释它。希望这会有所帮助。

<小时/>

当你声明一个数组时

int a[3] = {5, 4, 6}  

内存排列如下

enter image description here

现在回答您的问题:

  1. a and &a have the same values.How?

正如您所知,a 是数组类型,并且数组名称 a 成为指向数组 a 第一个元素的指针(衰减后) ),即它指向地址0x100。请注意,0x100 也是内存块(数组a)的起始地址。而且你应该知道,一般来说,第一个字节的地址被称为变量的地址。也就是说,如果一个变量有 100 个字节,那么它的地址等于它的第一个字节的地址。

&a是整个内存块的地址,即数组a的地址。见图:

enter image description here

现在您可以理解为什么 a&a 具有相同的地址值,尽管它们的类型不同。

What exactly it does int (*p)[3]; Declares a pointer to an array,i know this.But,how a pointer to an array is different from the pointer to the first element of the array and name of the array?

看上图,清楚地解释了指向数组的指针与指向数组元素的指针的不同。
当您将 &a 分配给 p 时,p 指向起始地址为 0x100 的整个数组。

<小时/>

注意:关于该行

... as in C arrays are passed by references (with exception of sizeof function).

在 C 中,参数是按值传递的。 C 中没有按引用传递。当普通变量传递给函数时,其值会被复制;对相应参数的任何更改都不会影响该变量。
数组也是按值传递,但不同之处在于数组名称衰减为指向第一个元素的指针,并将此指针分配给函数的参数(这里,指针值被复制);数组本身不会被复制。
与普通变量相比,用作参数的数组不会受到任何更改的保护,因为不会复制数组本身,而是复制指向第一个元素的指针。

您还应该注意,sizeof 不是函数,在这种情况下数组名称不充当参数。 sizeof 是一个运算符,数组名称用作操作数。当数组名称是一元 & 运算符的操作数时,同样成立。

关于c - c中的数组名到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27659361/

相关文章:

c - 修改结构体指针

c - 在没有堆栈的情况下在 Linux 上进行系统调用

java - Java TicTacToe 游戏中的行和列搜索

java - 检索分配到数组内随机索引的字符串

c - char* 和 char** 之间的区别(在 C 中)

c - 访问冲突

c - 仅用1条语句就能将数组元素设为零?

python - 为什么 dgemm (Cython 编译)比 numpy.dot 慢

c++ - `this == &x` 是确定指针 (this) 和引用 (x) 是否指向同一对象的正确方法吗?

ios - 尝试将字符串数组传递给目标 View Controller