int **ptr 与 int ptr[4][4] 的区别???

collide 2001-08-21 11:55:26
**ptr能用做二维数组吗?
...全文
284 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnss 2001-08-23
  • 打赏
  • 举报
回复
gz
collide 2001-08-23
  • 打赏
  • 举报
回复
But what i write above is wrong!!
so i ask you to answer to me.
collide 2001-08-23
  • 打赏
  • 举报
回复
不要打乱麻
lypp 2001-08-23
  • 打赏
  • 举报
回复
int **ptr表示存放一个指针地址的指针,它是一个二级指针。
int ptr[4][4]表示二维数组。
**ptr可以用做二维数组,如下:
char * proname[]={"fortran",
"c",
"c++"};
char *ptr1;
char **ptr2;
ptr1=proname[0];
ptr2=&ptr1;
ptr2就表示一个二维数组。
老南 2001-08-22
  • 打赏
  • 举报
回复
一句话,int **ptr是一个可变的句柄,你可以让它指向任何你感兴趣的内容(一般的,你准备把这个内容当作一个二维数组看待),它并没有分配任何存放实际数据的空间——这也是它不必要指定大小的原因,而int ptr[4][4]是一个空间,当然,这个空间附送了你一个引用它的句柄,这个句柄既然是配合这个空间附送给你的,当然它值用于引用这个空间,所以它是不可变得。
老南 2001-08-22
  • 打赏
  • 举报
回复
区别在于:int **ptr定义了一个指针(具体的,二级指针),它使得编译程序使程序在运行时分配一点点内存用来存放这个指针——某个数值,它标明了内存中的某个位置;而int ptr[4][4]定义了一个二维数组,它使得编译程序让程序在运行时在内存中分配sizeof(int)*4*4个字节用来存放数据。int **ptr中定义的ptr是一个变量,如果需要,你可以随时变换它的值——它也仅仅是一个值;而int ptr[4][4]中定义的ptr本身是一个常量.这个常量用来使编译器明白你所引用的是那个你已经为其分配过内存的数组,ptr这个引用的有效性依赖于编译器,编译器会直接把它替换成某个常量——在运行时,根本没有任何内存空间来把这个值当作变量存放,它存在于代码中,是在连接时已经指定好的,一般的,程序本身没有权利再去改变它。
xiaowei27 2001-08-22
  • 打赏
  • 举报
回复
忘了,10分都给我,不然我生气了哦。
看着那只红马,烦了。
xiaowei27 2001-08-22
  • 打赏
  • 举报
回复
可以啊最好这样理解。
你应该知道
*(*(ptr+1)+2);相当于ptr[1][2];
呵呵。
**p可以理解成*((*p+0)+0);相当于ptr[0][0];
Last_Dodo 2001-08-22
  • 打赏
  • 举报
回复
Double pointer can hold a two dimension array but it does not have to.
int **ptr = new int*[4];
for (int i = 0; i < 4; i++) ptr[i] = new int[4];
ptr holds a 4X4 array.

If I change the for loop to:
ptr[0] = new int[4];
ptr[1] = new int[3];
ptr[2] = new int[2];
ptr[3] = new int;
obviously, it is no longer a 4X4 array (it is not an array anymore).

Or:
for (int i = 0; i < 4; i++) ptr[i] = new int;
you got a one dimension array with lot of wasted space.

Or:
int **ptr = new int*;
*ptr = new int;
you got only one integer with two level of indirect access.

There is another major difference in pointer operation:
int array[4][4]
int **ptr = new int*[4];
for (int i = 0; i < 4; i++) ptr[i] = new int[4];
You can use ptr++ to move to next row and the value of ptr increases is sizeof(int*) (4 in 32 bit addressing). The address of array[1][0] is 4*sizeof(int) (16 in 32 bit addressing) higher than array[0][0]
yug 2001-08-22
  • 打赏
  • 举报
回复
呵呵,说错了
yhq 2001-08-22
  • 打赏
  • 举报
回复
应该是ptr=(int**)malloc(sizeof(int *)*4); 然后是for循环.
其实succ(詹天佐)说的非常好,你应该再多读几遍.
yug 2001-08-22
  • 打赏
  • 举报
回复
都对,不过后者最方便啦,完全可以看作int ptr[4][4];了
collide 2001-08-22
  • 打赏
  • 举报
回复
可是,我用turbo c写了一个程序,其中用**ptr在程序中动态分配一块空间,把另一个数组常量传给它,我首先分配空间,这样对吗:int matrix[4][4]为常量。
for(i=0;i<4;i++)
{
ptr[i]=(int *)malloc(sizeof(int)*4);
for(y=0;y<4;y++)
ptr[i][y]=matrix[i][y]; /*赋值*/
}
这样对吗??还是这样:
ptr=(int*)malloc(sizeof(int)*4*4);
fsb_12345 2001-08-22
  • 打赏
  • 举报
回复
*(*(ptr+n)+m);相当于ptr[n][m];
zh9625 2001-08-22
  • 打赏
  • 举报
回复
红马? 是级别象征吗?

69,374

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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