<C/C++>指向指针的指针、指向数组的指针以及存放指针的数组
2014-05-20 18:57
393 查看
关于指针这块,有段时间没有接触了(因为最近都是在使用java),感觉有点生疏了,昨天同学问了关于一个指针的问题,当时竟然卡住了,好吧,还是基础不够牢靠啊,突然觉得掌握了东西还是要以某种形式记录下来,光靠记忆还是不行,不能懒惰,所以把昨天的问题总结下。
昨天同学的问题如下:
问new右边的是什么意思,如果写成new (int*)[2]又会怎样?
第一种写法(new int*[2]):正确的,因为它表示的是申请了一个长度为2数组,数组中存放的是指向int型的指针;
第二种写法(new (int *)[2]):错误的,它表示的是指向数组的指针,该数组是一个长度为2的int型数组,编译器是不支持这样申请空间的。
(1)int ** pp; 表示指向指针的指针;(指针的指针)
(2)int *p[3]; 表示一个长度为3的数组,数组中存放的是指向int型的指针;(存放指针的数组)
(3)int (*p)[3]; 表示p是一个指针,指向一个长度为3的int型数组;(指向数组的指针)
如何证明上面关于存放指针的数组和指向数组的指针说法的正确呢?通过对p的地址进行+1,来查看p+1和p的地址相差值就可以明了。(32bit编译器)如果相差4,说明是存放指针的数组,如果相差4*3(这里是3,也就是所指向的数组的长度),程序如下:
运行结果如下:
以上乃个人理解,如有不对,望请指出,不甚感激。
昨天同学的问题如下:
int ** p_point; p_point = new int*[2];
问new右边的是什么意思,如果写成new (int*)[2]又会怎样?
第一种写法(new int*[2]):正确的,因为它表示的是申请了一个长度为2数组,数组中存放的是指向int型的指针;
第二种写法(new (int *)[2]):错误的,它表示的是指向数组的指针,该数组是一个长度为2的int型数组,编译器是不支持这样申请空间的。
(1)int ** pp; 表示指向指针的指针;(指针的指针)
(2)int *p[3]; 表示一个长度为3的数组,数组中存放的是指向int型的指针;(存放指针的数组)
(3)int (*p)[3]; 表示p是一个指针,指向一个长度为3的int型数组;(指向数组的指针)
如何证明上面关于存放指针的数组和指向数组的指针说法的正确呢?通过对p的地址进行+1,来查看p+1和p的地址相差值就可以明了。(32bit编译器)如果相差4,说明是存放指针的数组,如果相差4*3(这里是3,也就是所指向的数组的长度),程序如下:
int (*p)[3]; p = new int[2][3]; int i = 1,j = 2; int *pb[2] = {&i,&j}; printf("指向数组的指针: %x, %x\n",(p+1),p); printf("存放指针的数组: %x,%x\n",(pb+1),pb);
运行结果如下:
以上乃个人理解,如有不对,望请指出,不甚感激。
相关文章推荐
- 彻底征服<<指针数组和指向数组的指针>>
- <<c++ primer>> 函数指针的笔记
- <<c++ primer>> 指向const对象指针&const指针
- <C基础>数组和指针
- 指向list 的指针 list<int> *pmylist = new list<int> [2];
- <<C++Primer PLus 第五版>>读书笔记4(终篇)
- <<c++ primer>> 强制类型转换
- C++中重载数组下标访问操作符[ ] 和 赋值操作符 = ,* 和 -> 操作符和取反 !以及转化操作符bool和void*
- <kingofark关于学习C++和编程的50个观点> 详解 - 预览版
- <技术篇-技巧一>数组和指针并不相同
- 彻底搞清C/C++中一维数组,二维数组,指针,数组指针和指针数组以及指向指针的指针,行地址和列地址之间的关系
- <<C++Primer PLus 第五版>>读书笔记2
- <转载自刘佳ID:freedom0203和waret> C++中成员初始化列表的使用
- <林锐高质量c/c++编程指南>记录
- <转> 模板类 声明和定义 编译 c++
- <<C++程序设计与原理>> 笔记
- c与c++的区别 <转> 深有感触
- <C++>error LNK2001错误
- &lt;转载自刘佳ID:freedom0203和waret&gt; C++中成员初始化列表的使用
- C++中输入输出<< 和>>重载,以便适应输出输入一个对象