请教:一个关于二维数组和指针的问题

ribut9225 2008-02-22 04:55:57
学习指针的过程,越学越糊涂了。请各位指点

书里写:
一、通过建立一个指针数组引用二维数组元素
int *p[3],a[3][2],i,j;
由于[]优先级高于*,所以,p首先与[]结合,构成p[3],说明了p是一个数组名,而*则说明了数组p是指针类型,它的每个元素都是基类型为int的指针。

for(i=0;i<3;i++)
p[i]=a[i];
它们的等价形式如下:
(1)、*(p[i]+j) /* 与*(a[i]+j)对应 */
(2)、*(*(p+i)+j) /* 与*(*(a+i)+j)对应 */

二、通过建立一个行指针引用二维数组
定义:
int a[3][2],(*p)[2];
这里p先与*结合,说明p是一个指针变量,然后再与说明符[2]结合,说明指针变量p的基类型是一个包含有两个int元素的数组。在这里p的基类型与a相同,因这p=a是合法的赋值语句
它们的等价形式如下:
(1)、*(p[i]+j) /* 与*([ai]+j)对应 */
(2)、*(*p+i)+j) /* 与*(*(a+i)+j)对应 */


问题:
一、*p[3]与(*p)[3]有什么区别??
二、他们的等价形式都一样,为什么要分别写二种形式??

请指点
谢谢
...全文
223 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ningweidong 2008-02-23
  • 打赏
  • 举报
回复
*p[3]与(*p)[3]有什么区别??

一个是指针数组,一个是数组指针,
指针数组,它是一个数组,数组中的元素都是指针.
数组指针,它是一个指针,它指向一个数组.
就呆在云上 2008-02-23
  • 打赏
  • 举报
回复
本质明显不同哦
一个是游离的
有个是固定的地址
ribut9225 2008-02-23
  • 打赏
  • 举报
回复
上面的写错了


本质不同
(*p)[3]的本质是指针,指向其他二维数组(第二维的上限是3)

而*p[3]的本质是数组,是包含有三个指针数组

这样理解对不对?
ribut9225 2008-02-23
  • 打赏
  • 举报
回复

本质不同
(*p)[3]的本质是指针,指向其他二维数组(第二维的上限是3)

而*p[3]的本质是指针,实际上是三个指针

这样理解对不对?
ribut9225 2008-02-23
  • 打赏
  • 举报
回复
谢谢各位
结贴
anmoi_yang 2008-02-23
  • 打赏
  • 举报
回复
1. *p[3]是指针数组, 一般用来表示多个字符串数组, (*p)[3]是指向数组的指针.

2.他们的等价形式都一样,为什么要分别写二种形式??==>>先请理解数组首地址与数组名的关系; 在编程中最好使用指针p来表示.
sheenl 2008-02-23
  • 打赏
  • 举报
回复
这两种类型不能自动转换, 所以要用
p = &a[0][0]

如果要自动转换, 就定义
int (*p)[3] = a;

其实int *p 和 int (*p)[3]是一样的东西, 都是一个指针, 只是编译器认为前一个指针指向一个int型变量, 后一个指针指向一个包含三个int型元素的数组(这种指针变量的类型为 int (*)[3], 也就是vc那个报警想要说的东西)。
后一种指针, 可以用隐式转换,用一个a[x][3]类型的数组赋值, x为任意整数。

ribut9225 2008-02-23
  • 打赏
  • 举报
回复
呵呵

最后再问一个问题

int a[2][3];
int *p;

p=a;

这样好像也是可以的
因为书上说:二维数组名也是一个地址值常量

用VC6编译器这样赋值,最后结果也正确
就是编译的时候有个警告:
warning C4047: '=' : 'int*' differs in levels of indirection from 'int (*)[3]'

请各位再指点一下
ribut9225 2008-02-23
  • 打赏
  • 举报
回复
int *p = &a[0][0];
即可, 不需要定义指针的指针。

////////////////////////

谢谢,你的方法是可行的

可能是偶绕过头了吧 ^_^

for(i=1;i<=6;i++)
{
printf("%d ",*p);
p++;

if(k%3 ==0)
printf("\n");
}

呵呵
原来二维数组在内存中也是连续的,
所以就不需要用指针的指针

多谢各位指点
星期一结帐
ribut9225 2008-02-23
  • 打赏
  • 举报
回复
偶又做了一个测试


int a[2][3]={
{0,1,2},
{0,1,2}
}
int *p;
int **m;
int k;

p=a[0];
m=&p;

//输入出
for(k=0;i<6;k++)
{
printf("%d ",*m);
m++;
if( k%3 == 0)
printf("\n");
}



输入出结果是
1245032
0 1 2
0 1

但是如用双重循环输入二维数组就没问题
for(k=0;k<2;k++)
{
for(j=0;j<3;j++)
{
printf("%d ",a[k][j]);
}
printf("\n");
}
显示结果就是对
0 1 2
0 1 2
sheenl 2008-02-23
  • 打赏
  • 举报
回复
int *p = &a[0][0];
即可, 不需要定义指针的指针。
ribut9225 2008-02-23
  • 打赏
  • 举报
回复
那再请教一下二维数组与双重指针的操作

双重指针能操作二维数组吗??

int a[2][3];
int **p;

如何通过指针p来操作二维数组a??

谢谢

(注:书是越看越晕,一维数组还好理解,二维数组就开始晕了)
星羽 2008-02-22
  • 打赏
  • 举报
回复

一、

*p[3] 是指针的数组
(*p)[3] 是数组的指针

#include "stdio.h"

int main()
{
int* p1[10];
for (int i = 0; i < 10; ++i)
p1[i] = new int[5];

int (*p2)[10];

int a[10];

p2 = &a;




return 0;
}





visame 2008-02-22
  • 打赏
  • 举报
回复
Pointers and Arrays
老生常谈的经典问题。
推荐你看一本书:Pointers On C。
光跃 2008-02-22
  • 打赏
  • 举报
回复
问题二:这不是两种形式,因为两种表示很不一样
p[3][2]实际分配了栈内存,而(*p)[2]只是一个指向一维数组的指针,而这个指针究竟指向什么,并没有确定。也就是说第二种形式用来操纵已分配的数组比较方便。
简单地说:类似p[2]和*p的区别,只是扩展到了二维。。。
cia426 2008-02-22
  • 打赏
  • 举报
回复
是不是可以这样理解1楼和2楼的意思:
int *p[3] == 三个指针,即*p[0]、*p[1]、*p[2]
而int (*p)[3] == 一个指向无名且含有[3]个普通int元素的int指针??
sheenl 2008-02-22
  • 打赏
  • 举报
回复
(*p)[3]是一个指针, 指向一个含有三个元素的数组
*p[3]是一个数组, 其元素为三个指针类型的变量
意思完全不同。
  • 打赏
  • 举报
回复
int *p[3];指针数组

int(*p)[3];

数组的指针; int a[3];int(*p)[3] = &a;

64,637

社区成员

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

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