6 回答
TA贡献2080条经验 获得超4个赞
数组是一个数组,指针是指针,但在大多数情况下,数组名称将转换为指针。经常使用的一个术语是它们会衰减到指针。
这是一个数组:
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
意味着数组本身。
TA贡献1852条经验 获得超1个赞
当数组用作值时,其名称表示第一个元素的地址。
当数组未用作值时,其名称表示整个数组。
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 */
TA贡献1936条经验 获得超6个赞
一个像这样声明的数组
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
TA贡献1797条经验 获得超4个赞
我认为这个例子揭示了这个问题:
#include <stdio.h>
int main()
{
int a[3] = {9, 10, 11};
int **b = &a;
printf("a == &a: %d\n", a == b);
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
int **b = &a;
^
p.c:8:28: warning: comparison of distinct pointer types lacks a cast
printf("a == &a: %d\n", a == b);
C ++在编译时拒绝任何此类错误尝试。
编辑:
这就是我要展示的意思:
#include <stdio.h>
int main()
{
int a[3] = {9, 10, 11};
void *c = a;
void *b = &a;
void *d = &c;
printf("a == &a: %d\n", a == b);
printf("c == &c: %d\n", c == d);
return 0;
}
即使c并且a“指向”相同的内存,也可以获取c指针的地址,但是无法获取a指针的地址。
- 6 回答
- 0 关注
- 1174 浏览
添加回答
举报