数组的名字是C语言中的指针吗? 如果不是,数组的名称和指针变量之间的区别是什么?
当前回答
数组名的行为类似于指针,指向数组的第一个元素。例子:
int a[]={1,2,3};
printf("%p\n",a); //result is similar to 0x7fff6fe40bc0
printf("%p\n",&a[0]); //result is similar to 0x7fff6fe40bc0
这两个print语句将为一台机器提供完全相同的输出。在我的系统中,它给出:
0x7fff6fe40bc0
其他回答
当数组用作值时,它的名称表示第一个元素的地址。 当数组不用作值时,其名称代表整个数组。
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 */
我认为这个例子可以说明这个问题:
#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指针的地址。
数组名的行为类似于指针,指向数组的第一个元素。例子:
int a[]={1,2,3};
printf("%p\n",a); //result is similar to 0x7fff6fe40bc0
printf("%p\n",&a[0]); //result is similar to 0x7fff6fe40bc0
这两个print语句将为一台机器提供完全相同的输出。在我的系统中,它给出:
0x7fff6fe40bc0
像这样声明的数组
int a[10];
为10个int类型分配内存。你不能修改a,但你可以用a做指针算术。
这样的指针仅为指针p分配内存:
int *p;
它不分配任何int型。你可以修改它:
p = a;
并像使用a一样使用数组下标:
p[2] = 5;
a[2] = 5; // same
*(p+2) = 5; // same effect
*(a+2) = 5; // same effect
数组名本身会产生一个内存位置,所以你可以像对待指针一样对待数组名:
int a[7];
a[0] = 1976;
a[1] = 1984;
printf("memory location of a: %p", a);
printf("value at memory location %p is %d", a, *a);
你还可以对指针做其他漂亮的事情(例如增加/减去偏移量),你也可以对数组做:
printf("value at memory location %p is %d", a + 1, *(a + 1));
在语言方面,如果C语言没有将数组公开为某种“指针”(学究地说,它只是一个内存位置)。它不能指向内存中的任意位置,也不能由程序员控制)。我们总是需要这样编码:
printf("value at memory location %p is %d", &a[1], a[1]);