数组 array[6]中&array代表什么?

gtaerchina 2011-03-27 06:22:14
#include<stdio.h>
#include<conio.h>
void main()
{
char array[]="hello";
printf("%9s = %p\n"
"%9s = %p\n"
"%9s = %p\n","array",array,"&array[0]",&array[0],"&array",&array);
getch();
}
/*
array &array[0] 代表数组起始地址
那么&array代表什么?
程序运行结果三个一致。
*/
...全文
521 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hope_fu 2011-03-28
  • 打赏
  • 举报
回复
数组名表示数组首元素的首地址,这个地址范围是数组中一个元素的地址范围;数组名前加首地址表示数组的首地址,而这个地址范围是整个数组的地址范围。
如int a[5],a表示的其实就是&a[0],地址范围:&a[0]+sizeof(int)
而&a表示的是数组的首地址,虽然这个地址和&a[0],a相同,但是地址范围却不同,为&a[0]+sizeof(a)
当格式化输出的时候,如果是用%s输出字符串,那么a,&a,&a[0]的输出结果会是一样的,因为用%s格式化输出时要求参数是一个地址,它不会理会这个地址的地址范围,直到输出字符串最后一个字符停止,也就是"\0"。但是用%c格式化输出时,a,&a[0]都将输出首字符,而&a将会出错,因为编译器他们的地址范围不匹配。
dcw0402 2011-03-28
  • 打赏
  • 举报
回复
技术月经贴.
wizard_tiger 2011-03-28
  • 打赏
  • 举报
回复
三个数值是一样的但表示的意思不同。
算一下*(array+1)、*(&array[0]+1)和*(&array+1)这三个表达式就明白了。
《C和指针》中有说明。
luotuo44 2011-03-28
  • 打赏
  • 举报
回复
array是位指针。&array在行指针,指向一行. 就像二维指针a[2][3] 的a那样。楼主可以输出一下(array+1)和(&array+1)的值。会发现(array+1)的地址只是跳过一位,二(&array+1)则跳过一行。楼主代码中的一行是"hello", 5个字节。
赵4老师 2011-03-28
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”
g315580086 2011-03-27
  • 打赏
  • 举报
回复
推荐《C与指针》
某某9 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pathuang68 的回复:]

array、&array和&array[0]的值尽管一样,但本质上有很大的不同。
&array代表的是array的起始地址。
&array[0]和array同义,代表的是array中第一个元素的地址。

做一个这样实验,就可以很清楚地看到他们的不同(注意其中的注释)
C/C++ code

#include <iostream>
using names……
[/Quote]&array代表的是array的起始地址。
&array[0]和array同义,代表的是array中第一个元素的地址。
Lactoferrin 2011-03-27
  • 打赏
  • 举报
回复
说简单点,三者数值一样,但类型不一样
array:char[6]
&array[0]:char*
&array:char(*)[6]或char[6],和编译器有关
sizeof array=6
sizeof &array[0]=4
sizeof &array=4或6,和编译器有关

用法
char arr[6];char*a,(*b)[6];
a=arr;对
a=&arr;错
b=arr;错
b=&arr;对
Meteor_Code 2011-03-27
  • 打赏
  • 举报
回复
看这个
http://topic.csdn.net/u/20110304/16/481e828a-bbd6-4ddf-9d1d-8e591dbd651e.html
pathuang68 2011-03-27
  • 打赏
  • 举报
回复
array、&array和&array[0]的值尽管一样,但本质上有很大的不同。
&array代表的是array的起始地址。
&array[0]和array同义,代表的是array中第一个元素的地址。

做一个这样实验,就可以很清楚地看到他们的不同(注意其中的注释)

#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
int array[6] = {0, 1, 2, 3, 4, 5};
cout << (int *)&array << endl;
cout << (int *)array << endl;
cout << (int *)&array[0] << endl;
cout << "=====================" << endl;
cout << (int *)(&array + 1) - (int *)&array << endl; // 输出为6,&array + 1中的加1是加一个array数组的大小
cout << (int *)(array + 1) - (int *)array << endl; // 输出为1,array + 1中的加1是加一个array数组元素的大小
cout << (int *)(&array[0] + 1) - (int *)&array[0] << endl; // 输出为1,&array[0] + 1中的加1也是加一个array数组元素的大小
return 0;
}
errno 2011-03-27
  • 打赏
  • 举报
回复
自己打字,错误拍砖。
首先我们来说明array和&array[0]
要知道,在编译阶段,编译器维护着一个符号表,array就在这个符号表里面,它的值是数组第一个元素的内存地址,类型是char*。

而array[0],是该数组的第一个元素,它的类型是char,&进行了取地址的操作,所以&array[0]的类型是char*.

当你调用printf函数输出这个字符串的时候array和&array[0]的作用都是将字符串的首地址传送给printf函数,之后printf函数以这个地址作为起始点开始依次输出这个数组中的每一个字符,直到运行到'\0'时停止。


char ar[]="hello";
printf("%s",array); //这时候输出正常
char ar2[]={'h','e','l','l','o'};
printf("%s",array); //这里会输出异常,具体的异常跟各个编译器不同的实现有关系,例如我用的gcc,就在输出hello之后,输出了一个乱码。


而&array的类型是char(*)[6] <--可以理解为指向一个类型为char长度为6的数组的指针。
当我输入
printf("%s",&array)
的时候,我的编译器会提示一个类型不匹配的warning
temp.c:32: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[6]’

希望上面自己的理解能对你有所帮助。
zhouhui915 2011-03-27
  • 打赏
  • 举报
回复
1楼说的对,是指向有6个字符的数组的指针,即char (*p)[6]
alweeq86 2011-03-27
  • 打赏
  • 举报
回复
&array 也是取首地址啊
Lactoferrin 2011-03-27
  • 打赏
  • 举报
回复
&array的数值等于array,&array[0]
类型是char(*)[6]

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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