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

请教C++primer上一个小例子的问题。。。

mojie
2010/10/26镜像同步11 回复
第四版中文版第123页下面的这个小例子 int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11}; int (*ip)[4] = a; cout << *ip <<endl; //问题1 对ip解引用得到的是地址 需要进行两次解引用才能得到0 cout << *a <<endl; int *p; p = &a[1]; //问题2 这里好像错了 有取地址操作符会报错 cout << *p <<endl; //问题3 这样定义的指针只需要一次解引用就可以了 求大牛解释。。。 另外发现visual sdudio 的一个小问题 6.0版本里面for(int i = 0;i<5;i++){...} cout << i << endl;居然可以输出5 但是2008版本里面就不行了 感觉6.0版本的似乎更实用一些 根据i等于不等于5可以判断循环是否完全执行
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
ki机器人#1 · 2010/10/26
没明白你什么意思 cout << *ip <<endl; //问题1 对ip解引用得到的是地址 需要进行两次解引用才能得到0 ip是个地址, *ip 就是值啊 cout << *a <<endl; int *p; p = &a[1]; //问题2 这里好像错了 有取地址操作符会报错 实际上不会报错吧? cout << *p <<endl; //问题3 这样定义的指针只需要一次解引用就可以了 关键在于你想输出的是什么? 【 在 mojie 的大作中提到: 】 : 第四版中文版第123页下面的这个小例子 : int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11}; : int (*ip)[4] = a; : ...................
mojie机器人#2 · 2010/10/26
cout << *ip <<endl;输出的是地址 cout << **ip <<endl;才输出了数组中第一个元素0 cout <<ip<<endl;和cout<<*ip<<endl;输出的是一样的地址。。。! 【 在 ki 的大作中提到: 】 : : 没明白你什么意思 : cout << *ip <<endl; //问题1 对ip解引用得到的是地址 需要进行两次解引用才能得到0 : ...................
mojie机器人#3 · 2010/10/26
p = &a[1];确实会报错。。。 error C2440: “=”: 无法从“int (*)[4]”转换为“int *” 我用的vs2008 【 在 ki 的大作中提到: 】 : : 没明白你什么意思 : cout << *ip <<endl; //问题1 对ip解引用得到的是地址 需要进行两次解引用才能得到0 : ...................
ki机器人#4 · 2010/10/26
我试了。这个在 c 里面是 warning 在 c++ 里面是错误。 【 在 mojie 的大作中提到: 】 : p = &a[1];确实会报错。。。 : error C2440: “=”: 无法从“int (*)[4]”转换为“int *” : 我用的vs2008
ki机器人#5 · 2010/10/26
root@testmachine3:~/test# g++ -o e e.c e.c: In function ‘int main()’: e.c:8: error: cannot convert ‘int (*)[4]’ to ‘int*’ in assignment root@testmachine3:~/test# gcc -o e e.c e.c: In function ‘main’: e.c:8: warning: assignment from incompatible pointer type root@testmachine3:~/test# cat e.c main() { int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11}; int (*ip)[4] = a; int *p; p = &a[1]; } root@testmachine3:~/test#
ki机器人#6 · 2010/10/26
不过也就是个指针类型转换问题,倒是不难理解,看来 C++ 对类型转换限制比较严格。
a206206机器人#7 · 2010/10/26
看lz问题想问下,对指向数组的指针复引用出来是个什么东西啊,如果是个数组的话,就应该是a了,那么lz说的**ip就是a【0】
xiangziwade机器人#8 · 2010/10/26
ip是个指针数组,所以要解引用两次才能得到值 后边应该是 ip=&a[1], a 是二维数组,a[1]是个地址 最后的能不能输出5好像是跟系统和编译器有关的,C++的标准里应该是不允许的, C++ primer里好多地方都指出有些标准未定义的行为,不同的系统和编译器会做不同的处理, 如果要用输出的5作为判决条件会影响程序的可移植性
ki机器人#9 · 2010/10/26
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11}; int (*p1)[4] = a; int b[5][3][4] = {0,1,2,3,4,5,6,7,8,9,10,11}; int (*p2)[3][4] = b; got it?