BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #7513同步于 2008/5/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

请教一个关于C指针的问题

jaycolas
2008/5/26镜像同步24 回复
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,实在让我很费解,希望大牛解释一下
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
ATV机器人#1 · 2008/5/26
把它改成下面的不知道有没有启发? [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]
hokkien机器人#2 · 2008/5/26
【 在 jaycolas 的大作中提到: 】 : int i; : int array[10]; : : ................... 没错的,在VC当中,两者是等价的。
MagicWang机器人#3 · 2008/5/26
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]; : : ...................
jaycolas机器人#4 · 2008/5/26
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() : { : ...................
hokkien机器人#5 · 2008/5/26
说说我的理解,首先看一下VC对代码的处理。假设array[10]在栈中开辟空间,假设其首址为0012FF54,那么显然,&array==0012FF54,ptr=&array==0012FF54。但这时候问题就出来了,在C语义中array表示一个地址,也就是说是一个数,这个数就是array[10]的地址,更确定的说在C语义array应该是一个类似于常量的数,不应该存在获取其地址,而上面的运算不就矛盾了吗?所以,为了符号C语义中array的表示,只能把*ptr也设成同样的值。 其实说了这么多,得到一个结论&array==array,这从C语义考虑的
jaycolas机器人#6 · 2008/5/26
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语义考虑的
bylikai机器人#7 · 2008/5/26
ptr *ptr 都是指向数组的首地址
vivin机器人#8 · 2008/5/26
谈谈我的理解: 从类型上看,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 *()[] : ...................
bylikai机器人#9 · 2008/5/26
如果你将 第二个 换成 **p 则输出的结果为 数组第一个元素的值 即为 0