返回信息流int i;
int array[10];
for(i=0;i<10;i++)
{
array[i]=i;
}
int (*ptr)[10]=&array;
cout<<ptr<<endl;
cout<<*ptr<<endl;
假设数组array的首地址是0xABCDABCD;
哪么该程序的输出结果
在VC下面就是(大家可以编译一下试试)
0xABCDABCD
0xABCDABCD
这个意思就是*ptr=ptr,实在让我很费解,希望大牛解释一下
这是一条镜像帖。来源:北邮人论坛 / cpp / #7513同步于 2008/5/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
请教一个关于C指针的问题
jaycolas
2008/5/26镜像同步24 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
把它改成下面的不知道有没有启发?
[quote]int main()
{
int i;
int array[10];
for(i=0;i<10;i++)
{
array[i]=i;
}
int (*ptr)[10]=&array;
cout<<ptr[1]<<endl;
cout<<(*ptr)[1]<<endl;
return 0;
} [/quote]
【 在 jaycolas 的大作中提到: 】
: int i;
: int array[10];
:
: ...................
没错的,在VC当中,两者是等价的。
ptr和*ptr的值是一样的,但意义是不同的,ptr表示一个长度为10的整形数组首地址,*ptr(即array)表示一个整形数组首元素的地质。ptr+1的结构为ptr的值增大10 * sizeof(int), 而*ptr+1的结果为ptr的值增大sizeof(int)。
这样,lz程序中的两个值是相等的,而1楼中的两个值不相等。
【 在 jaycolas 的大作中提到: 】
: int i;
: int array[10];
:
: ...................
ptr指向整个int array[10]的数组的内存区域(10*sizeof(int)的大小),ptr本身的值就是数组的0号元素的地址
我得理解是,*ptr就是代表的ptr所指向的内存区域的内容,在例子中,我就是觉得结果是0123456789
但是你的这个“启发”的意思(也就是现实情况),就是说*ptr实际上还是个指针,指针指向int array[10]的0号元素的内存区域(1*sizeof(int)的大小),*ptr本身的值还是数组0号元素的地址
【 在 ATV 的大作中提到: 】
: 把它改成下面的不知道有没有启发?
: [quote]int main()
: {
: ...................
说说我的理解,首先看一下VC对代码的处理。假设array[10]在栈中开辟空间,假设其首址为0012FF54,那么显然,&array==0012FF54,ptr=&array==0012FF54。但这时候问题就出来了,在C语义中array表示一个地址,也就是说是一个数,这个数就是array[10]的地址,更确定的说在C语义array应该是一个类似于常量的数,不应该存在获取其地址,而上面的运算不就矛盾了吗?所以,为了符号C语义中array的表示,只能把*ptr也设成同样的值。 其实说了这么多,得到一个结论&array==array,这从C语义考虑的
1.“在C语义array应该是一个类似于常量的数,不应该存在获取其地址,”这个是为什么呢?
是说常量不能获取地址么?
2.我本来写的是ptr=array,但是编译通不过,报错是cant convert int ()[] to int *()[]
3.ptr=&array,我理解这里把array当成了整个数组的代表,就如同sizeof(array)里面的array一样,我这样理解对么?
【 在 hokkien 的大作中提到: 】
: 说说我的理解,首先看一下VC对代码的处理。假设array[10]在栈中开辟空间,假设其首址为0012FF54,那么显然,&array==0012FF54,ptr=&array==0012FF54。但这时候问题就出来了,在C语义中array表示一个地址,也就是说是一个数,这个数就是array[10]的地址,更确定的说在C语义array应该是一个类似于常量的数,不应该存在获取其地址,而上面的运算不就矛盾了吗?所以,为了符号C语义中array的表示,只能把*ptr也设成同样的值。 其实说了这么多,得到一个结论&array==array,这从C语义考虑的
谈谈我的理解:
从类型上看,array既作为一个数组标记,它是只读的,但array也是一个int[10]的数组类型(array of 10 integer)的只读变量,而ptr是一个指针,指向int[10]类型,所以ptr=&array符合C语法,所以ptr=array显然类型检查就不会通过。
从值的意义上看,array的值首先标记了一个地址,这个地址是数组array的首地址,等于&a[0],而且同时array的值也是一个数组类型变量的值,此时最好把array看成是一个普通变量,取变量的地址&array,得到的是该数组类型变量在内存的位置,数值上等于&array[0]。所以看ptr的值,必然也等于&array[0].
【 在 jaycolas (小白) 的大作中提到: 】
: 1.“在C语义array应该是一个类似于常量的数,不应该存在获取其地址,”这个是为什么呢?
: 是说常量不能获取地址么?
: 2.我本来写的是ptr=array,但是编译通不过,报错是cant convert int ()[] to int *()[]
: ...................