返回信息流第四版中文版第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可以判断循环是否完全执行
这是一条镜像帖。来源:北邮人论坛 / cpp / #45315同步于 2010/10/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
请教C++primer上一个小例子的问题。。。
mojie
2010/10/26镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
没明白你什么意思
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;
: ...................
cout << *ip <<endl;输出的是地址 cout << **ip <<endl;才输出了数组中第一个元素0
cout <<ip<<endl;和cout<<*ip<<endl;输出的是一样的地址。。。!
【 在 ki 的大作中提到: 】
:
: 没明白你什么意思
: cout << *ip <<endl; //问题1 对ip解引用得到的是地址 需要进行两次解引用才能得到0
: ...................
p = &a[1];确实会报错。。。
error C2440: “=”: 无法从“int (*)[4]”转换为“int *”
我用的vs2008
【 在 ki 的大作中提到: 】
:
: 没明白你什么意思
: cout << *ip <<endl; //问题1 对ip解引用得到的是地址 需要进行两次解引用才能得到0
: ...................
我试了。这个在 c 里面是 warning 在 c++ 里面是错误。
【 在 mojie 的大作中提到: 】
: p = &a[1];确实会报错。。。
: error C2440: “=”: 无法从“int (*)[4]”转换为“int *”
: 我用的vs2008
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#
ip是个指针数组,所以要解引用两次才能得到值
后边应该是 ip=&a[1], a 是二维数组,a[1]是个地址
最后的能不能输出5好像是跟系统和编译器有关的,C++的标准里应该是不允许的,
C++ primer里好多地方都指出有些标准未定义的行为,不同的系统和编译器会做不同的处理,
如果要用输出的5作为判决条件会影响程序的可移植性
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?