a[]为数组,为什么a和&a值一样

swlyzju 2010-05-20 09:35:38
今天看到一本书说
a为数组首元素的首地址
&a为数组的首地址
为什么在编译器中两个值一样?

另1:
int a[5];
sizeof(&a)在VC6上输出为20,这是编译器错误吗?

另2:书上说:
如果文件1中定义 char a[] = "abc";
文件2中定义 extern char *a;
然后文件2中a指向的内存区域就存放了97("a"),然后用97作为数组地址去查找就出错.
而如果文件1中定义 char *a = "abc";
文件2中定义 extern char a[];
然后文件2中用数组a[]访问内容时,里面的内容为指针a中保存的"abc"的地址(如0x0000ff00),就会出错.

这个怎么理解?
我用char a[] = "abc";
char* p = a;
输出完全没问题啊!
用Watch窗口看了a的值跟p是一样的,里面都是保存了地址(如0x0000ff00)?
...全文
591 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
嘎文 2010-05-21
  • 打赏
  • 举报
回复
int a[5];
a和&a虽然在值上是一样的,但他们具有不同的类型
a的类型为int[5],它是指向具有5个元素的一维数组的指针,
&a的类型为int*[5],有点像int**,它是指针的指针,说具体点,它是一个指针,指向具有5个元素的一维数组指针的指针
liutengfeigo 2010-05-21
  • 打赏
  • 举报
回复
楼主可以去百度一下。然后选网易学院的那篇文章,那里解释得很好,~
piaoling1989 2010-05-21
  • 打赏
  • 举报
回复
不错的问题,我也想知道
softman11 2010-05-21
  • 打赏
  • 举报
回复
楼上把我想说的都说清楚了。

其实这就是乌龟的屁股,规定!

对数组而言,数组名称代表的就是数组的首元素的首地址。

而对数组名称的&运算符,就是返回指向一个数组的指针。

这两个数据对数组而言,自然是相同的。但是单位是不一样的。

指针的类型决定了它每次STEP的单元数。


blh 2010-05-21
  • 打赏
  • 举报
回复
虽然值是一样的但内在含义不同,
a为数组首元素的首地址
&a为指向整个数组的地址指针
可以看看下面的例子

#include <stdio.h>


int main()
{
int b[] = {5, 6, 7, 8};
int a[] = {1, 2, 3, 4};

printf("%p, %p, %p\n", a + 1, (&a) + 1, b);
return 0;
}
zhangweiit 2010-05-21
  • 打赏
  • 举报
回复
对于那个extern 字符指针与字符数组的问题
我也不懂要怎样解释
建议楼主把这段代码运行一下
有两个文件
文件1

#include <stdio.h>

extern char a[];

void printa1()
{
printf("1:-------------\n");
printf("1:a->s:%s\n",a);
printf("1:&a->s:%s\n",&a);
printf("1:a %d\n",a);
printf("1:&a %d\n",&a);
printf("1:sizeof(a) %d\n",sizeof(a));
printf("1:sizeof(&a) %d\n",sizeof(&a));
}
void printa2();

void main()
{
printa1();
printa2();
getchar();
}


文件2

char *a = "abc";

void printa2()
{
printf("2:-------------\n");
printf("2:a->s:%s\n",a);
printf("2:&a->s:%s\n",&a);
printf("2:a %d\n",a);
printf("2:&a %d\n",&a);
printf("2:sizeof(a) %d\n",sizeof(a));
printf("2:sizeof(&a) %d\n",sizeof(&a));
}


然后楼主可以把两边的a的类型从[]修改成*,或是从*修改成[],多尝试一下,看看输出结果
hunter103 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pengzhixi 的回复:]
类型不一样的:
比如 int a[10];a的类型是int [10];&a的类型是int(*p)[10];
[/Quote]
.
这个解释相对的经典!!!
zhangweiit 2010-05-21
  • 打赏
  • 举报
回复
文件1中 char *a = "abc"
文件2中 extern char[]
类型不一致的话,这编译器会做转换,而且,连地址都会不一样,不信,你打印出&a 试试看
其实一般也不这样用的
一土草三工 2010-05-21
  • 打赏
  • 举报
回复
学习了
zhangweiit 2010-05-21
  • 打赏
  • 举报
回复
a为数组首元素的首地址
&a为数组的首地址
为什么在编译器中两个值一样?
当然是一样的,这就好像说,你的头的高度,就是你的身高一样
不同的是a是以数组的一个元素为单位,而&a是以整个数组为单位


int a[5];
sizeof(&a)在VC6上输出为20,这是编译器错误吗?
编译器没错,这个&a就是一个指向int[5]的类型的指针,它的大小是5 * 4 = 20

97("a")
是数组中第一个元素的内容,而不是地址,当然不能用这个作为地址访问

  • 打赏
  • 举报
回复
今天看到一本书说
a为数组首元素的首地址
&a为数组的首地址
为什么在编译器中两个值一样?


数组的首地址不就是首元素的首地址
fireman_me 2010-05-21
  • 打赏
  • 举报
回复
过来学习的。
wang_qiao_ying 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 goforsky 的回复:]
C/C++ code

1:
对int a[5];来说
a
&a
&a[0]
三个的值大大小是一样,但是类型不同
a的类型和&a[0]一样,是 int *
&a的类型是 int(*)[5],
所以 sizeof(&a)=5*sizeof(int)=20;
尽管a的类型是int *,但是有个例外,sizeof(a),此时a代表的是整个数……
[/Quote]楼上说的挺有道理,应该就是那么回事,顶一个.
liutengfeigo 2010-05-21
  • 打赏
  • 举报
回复
zhao4zhong1 小红星 你给个正确的解释来咯。。。
liutengfeigo 2010-05-21
  • 打赏
  • 举报
回复
14楼的解释不看还好,一看吓一跳。
int a[10];a的类型是int [10];&a的类型是int(*p)[10];
int b[2][3];b的类型是int[2][3];&b的类型是int(*)[2][3];
liutengfeigo 2010-05-21
  • 打赏
  • 举报
回复
所以 sizeof(&a)=5*sizeof(int)=20; 14楼你确信?
我怎么得出的是4啊?
赵4老师 2010-05-21
  • 打赏
  • 举报
回复
不要迷信书;要迷信编译器和调试器。
Paradin 2010-05-21
  • 打赏
  • 举报
回复
谁说一样。。
mymtom 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 shihuaicheng 的回复:]

int a[5];
a和&a虽然在值上是一样的,但他们具有不同的类型
a的类型为int[5],它是指向具有5个元素的一维数组的指针,
&a的类型为int*[5],有点像int**,它是指针的指针,说具体点,它是一个指针,指向具有5个元素的一维数组指针的指针
[/Quote]
VC的错误.
GoForSky 2010-05-21
  • 打赏
  • 举报
回复

1:
对int a[5];来说
a
&a
&a[0]
三个的值大大小是一样,但是类型不同
a的类型和&a[0]一样,是 int *
&a的类型是 int(*)[5],
所以 sizeof(&a)=5*sizeof(int)=20;
尽管a的类型是int *,但是有个例外,sizeof(a),此时a代表的是整个数组,因此sizeof(a)是整个数组的大小
加载更多回复(13)

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧