C++ 二维指针心得

gw_editer 2011-09-26 11:05:13
C++ 二维指针心得,前几天用了一下二维指针,刚开始晕了,慢慢的搞明白了!有写的不对的地方还请指点!!
char **p = new char *[12];
\___即定义p[12] 申请了 12个p 指针的息栖地 向系统要了 12*4 byte 的空间存放 p[0]~p[11] ,而p[0]~p[11]是用来指向下面的地址,在这里既是一个数组的头所在的地址,见下面。

for(i = 0;i < 12 ; i++)
p[i] = new char[128];
每次申请 128byte 申请128次
实质 :当 i = 0;
char str[128];
p[0] -> str; 也就是p[0]指针指向一个新开辟的128byte的空间,p[1]~p[11] 同样。
所以**p 申请空间初始化的过程为
1、先分配*p的保存空间,用于保存p[0] ~ p[11]
2、再分配p[0]的指向空间,即真正存储内容的地方

与p[i][j] 比较
**p 申请的空间不一定连续,p[i]也有自己的存储空间
p[i][j] 的空间是连续的,p[i] 不需要存储
这里的比较是结合了自己的 C/C++ 经验,没用过汇编,可能代码优化后就变样了,都是连续存储!

**p空间的删除
for(i = 0;i < n; i++)
delete []p[i];

delete []p;

先删除最后开辟的空间 :p[i]指向的空间(内容保存的空间)因为是数组所以加上[],

在删除之前开辟的空间 :p 指向的空间,即p[i]指针的保存空间,因为是数组加上[]

有不对的地方请指点。。。一字千金啊!!!
...全文
201 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿尼小码 2011-09-26
  • 打赏
  • 举报
回复
**p空间的删除
for(i = 0;i < n; i++)
delete []p[i];

delete []p;

这点不错
赵4老师 2011-09-26
  • 打赏
  • 举报
回复
//在堆中开辟一个4×5的二维int数组
#include <stdio.h>
#include <malloc.h>
int **p;
int i,j;
void main() {
p=(int **)malloc(4*sizeof(int *));
if (NULL==p) return;
for (i=0;i<4;i++) {
p[i]=(int *)malloc(5*sizeof(int));
if (NULL==p[i]) return;
}
for (i=0;i<4;i++) {
for (j=0;j<5;j++) {
p[i][j]=i*5+j;
}
}
for (i=0;i<4;i++) {
for (j=0;j<5;j++) {
printf(" %2d",p[i][j]);
}
printf("\n");
}
for (i=0;i<4;i++) {
free(p[i]);
}
free(p);
}
// 0 1 2 3 4
// 5 6 7 8 9
// 10 11 12 13 14
// 15 16 17 18 19

//在堆中开辟一个3×4×5的3维int数组
#include <stdio.h>
#include <malloc.h>
int ***p;
int i,j,k;
void main() {
p=(int ***)malloc(3*sizeof(int **));
if (NULL==p) return;
for (i=0;i<3;i++) {
p[i]=(int **)malloc(4*sizeof(int *));
if (NULL==p[i]) return;
for (j=0;j<4;j++) {
p[i][j]=(int *)malloc(5*sizeof(int));
if (NULL==p[i][j]) return;
}
}
for (i=0;i<3;i++) {
for (j=0;j<4;j++) {
for (k=0;k<5;k++) {
p[i][j][k]=i*20+j*5+k;
}
}
}
for (i=0;i<3;i++) {
for (j=0;j<4;j++) {
for (k=0;k<5;k++) {
printf(" %2d",p[i][j][k]);
}
printf("\n");
}
printf("---------------\n");
}
for (i=0;i<3;i++) {
for (j=0;j<4;j++) {
free(p[i][j]);
}
free(p[i]);
}
free(p);
}
// 0 1 2 3 4
// 5 6 7 8 9
// 10 11 12 13 14
// 15 16 17 18 19
//---------------
// 20 21 22 23 24
// 25 26 27 28 29
// 30 31 32 33 34
// 35 36 37 38 39
//---------------
// 40 41 42 43 44
// 45 46 47 48 49
// 50 51 52 53 54
// 55 56 57 58 59
//---------------

VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
jilonglv 2011-09-26
  • 打赏
  • 举报
回复
可以啦。。。。
不过文字说明有点欠缺。。。。。
gw_editer 2011-09-26
  • 打赏
  • 举报
回复
连我的沙发都没了
大海啊全是水 2011-09-26
  • 打赏
  • 举报
回复
楼主 牛B 大拉! 厉害!膜拜!IT界的精英啊!
Enter空格 2011-09-26
  • 打赏
  • 举报
回复
看着乱七八糟的。。
难道这是“奇淫技巧”吗~~~
就想叫yoko 2011-09-26
  • 打赏
  • 举报
回复
基本 正确
luchangxing09 2011-09-26
  • 打赏
  • 举报
回复
学习了
#include<iostream>
using namespace std;
int main()
{
float (*cp)[9][8]=new float[8][9][8];
for(int i=0;i<8;i++)
for(int j=0;j<9;j++)
for(int k=0;k<8;k++)
*(*(*(cp+i)+j)+k)=static_cast<float>(i*100+j*10+k);
for( i=0;i<8;i++)
{
for(int j=0;j<9;j++)
{
for(int k=0;k<8;k++)
cout<<cp[i][j][k]<<" ";
cout<<endl;
}
cout<<endl;
}
delete[] cp;
return 0;
}


动态创建多维数组

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧