猿问

数组名称是指针吗?

数组名称是指针吗?

数组的名称是C中的指针吗?如果没有,数组的名称和指针变量之间有什么区别?



牧羊人nacy
浏览 1175回答 6
6回答

犯罪嫌疑人X

数组是一个数组,指针是指针,但在大多数情况下,数组名称将转换为指针。经常使用的一个术语是它们会衰减到指针。这是一个数组:int a[7];a 包含七个整数的空间,你可以在其中一个中赋值赋值,如下所示:a[3] = 9;这是一个指针:int *p;p不包含任何整数空格,但它可以指向整数的空格。例如,我们可以将其设置为指向数组中的一个位置a,例如第一个:p = &a[0];可能令人困惑的是你也可以这样写:p = a;这并没有数组的内容复制a到指针p(无论这将意味着)。相反,数组名称a将转换为指向其第一个元素的指针。因此,分配与前一个分配相同。现在您可以p以类似的方式使用数组:p[3] = 17;这有效的原因是C,中的数组解除引用运算符[ ]是根据指针定义的。x[y]意思是:从指针开始x,步骤y元素在指针指向的位置之后前进,然后取出那里的任何东西。使用指针算术语法,x[y]也可以写成*(x+y)。为了做到这与正常的阵列,比如我们的工作a,该名称a中a[3]必须首先被转换为一个指针(在第一元件a)。然后我们向前迈出3个元素,并采取任何在那里。换句话说:将元素放在数组中的第3位。(这是数组中的第四个元素,因为第一个元素编号为0.)因此,总之,C程序中的数组名称(在大多数情况下)转换为指针。一个例外是我们sizeof在数组上使用运算符。如果a在此上下文中转换为指针,sizeof a则会给出指针的大小而不是实际数组的大小,这将是相当无用的,因此在这种情况下a意味着数组本身。

小怪兽爱吃肉

当数组用作值时,其名称表示第一个元素的地址。当数组未用作值时,其名称表示整个数组。int arr[7];/* arr used as value */foo(arr);int x = *(arr + 1); /* same as arr[1] *//* arr not used as value */size_t bytes = sizeof arr;void *q = &arr; /* void pointers are compatible with pointers to any object */

LEATH

一个像这样声明的数组int a[10];分配内存10 int秒。你不能修改,a但你可以用指针算术a。像这样的指针只为指针分配内存p:int *p;它没有分配任何ints。你可以修改它:p = a;并使用数组下标,你可以使用:p[2] = 5;a[2] = 5;    // same*(p+2) = 5;  // same effect*(a+2) = 5;  // same effect

繁星coding

我认为这个例子揭示了这个问题:#include <stdio.h>int main(){&nbsp; &nbsp; &nbsp; &nbsp; int a[3] = {9, 10, 11};&nbsp; &nbsp; &nbsp; &nbsp; int **b = &a;&nbsp; &nbsp; &nbsp; &nbsp; printf("a == &a: %d\n", a == b);&nbsp; &nbsp; &nbsp; &nbsp; return 0;}它在gcc 4.9.2中编译好(带有2个警告),并打印以下内容:a == &a: 1哎呀:-)所以,结论是否定的,数组不是指针,它不是作为指针存储在内存中(甚至不是只读的指针),即使它看起来像是,因为你可以用&运算符获取它的地址。但是 - 哎呀 - 操作员不工作:-)),不管怎样,你都被警告过:p.c: In function ‘main’:pp.c:6:12: warning: initialization from incompatible pointer type&nbsp; int **b = &a;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ^p.c:8:28: warning: comparison of distinct pointer types lacks a cast&nbsp; printf("a == &a: %d\n", a == b);C ++在编译时拒绝任何此类错误尝试。编辑:这就是我要展示的意思:#include <stdio.h>int main(){&nbsp; &nbsp; int a[3] = {9, 10, 11};&nbsp; &nbsp; void *c = a;&nbsp; &nbsp; void *b = &a;&nbsp; &nbsp; void *d = &c;&nbsp; &nbsp; printf("a == &a: %d\n", a == b);&nbsp; &nbsp; printf("c == &c: %d\n", c == d);&nbsp; &nbsp; return 0;}即使c并且a“指向”相同的内存,也可以获取c指针的地址,但是无法获取a指针的地址。
随时随地看视频慕课网APP
我要回答