小小指针弄死你!我是晕了:(

benbebnmao 2004-01-29 11:30:19
大家先看看,下面那句是错的那句对的,我都标上号了。
如果你一眼就看出来了,一定给我讲讲啊:)哎,就是这么菜啊。
如果你也糊涂了,嘿嘿,和我一起郁闷吧。哈哈……
int main(int argc, char* argv[])
{
int a;
int *p1;
int **p2;
int array1[9];
int array2[9][9];
1. p1=array1;
2. p1=*p2;
3. p1=array2[8];
4. *p2=array1;
5. p2=array2;
6. *p2=p1;
7. *p2=array1;
8. p2=&p1;
9. p2=&array1;
10. **p2=array2[0][8];
11. *p2=&array2[0][0];
12. p2=&(&array2[0][7]);
13. *p2=array2[8];
14. *p2=*array2;
15. **p2=**array2;
16. p1=&a;
17. p2=&(&a);
return 0;
}

那句对那句错,编译一下就知道了,呵呵。
我就是对第一个错误不理解,没搞明白二重指针与二位数组有什么关系,
明白的人给我讲讲吧,
搞不清楚的兄弟也来一起探讨一下嘛。
来者有分!
...全文
370 64 打赏 收藏 转发到动态 举报
写回复
用AI写文章
64 条回复
切换为时间正序
请发表友善的回复…
发表回复
xxxno 2004-02-03
  • 打赏
  • 举报
回复
不好意思,不是报错是警告
czVigour 2004-02-03
  • 打赏
  • 举报
回复
语法上全部正确!!
xxxno 2004-02-03
  • 打赏
  • 举报
回复
P2=ARRAY[2]实际上你用在程序里也行,进行如: (*P2)[2]之类的取值没有问题的,不过会报错,要知道P2和ARRAY[2]所表示的含义是不一样的
一个是指向指针的指针,一个是二维数组
如果真的想不报错,试试这样:
int (*p2)[9][9]
int array2[9][9]
p2 = array2
这样没有问题
取值如: array2[2][3]可以这样写: p2[2][3]或者*(*(*p2+2)+3)
没有来得及调试过,各位试试看
xubai 2004-02-03
  • 打赏
  • 举报
回复
不好意思,应该是"后执行p = &&a;"
xubai 2004-02-03
  • 打赏
  • 举报
回复
二维数组的存储方式int array[a][b];在内存中二维数组的数据是线形存储的,即
array[0]...array[b-1]array[1]...array[b-1]...array[a-1]...array[b-1],所以有array和array[0],是相同的。而array[i](0<=i<a)是array[a][b]中每一维的起始地址。
5.p2 = array2 //是不正确的因为array2是地址,而p2存储的是指针变量
又因为声明变量时,已经确定了它的地址,也就是分配了空间,而指针变量是用来存储一般变量的地址,如果定义了int *p,**p1,a;后执行p = &&a;如何会成功呢,肯定会出现读内存非法但是执行p1= &p是正确的。因为p是变量有地址存在。对于以上赋值语句执行可能不会出错但是执行数据操作时肯定会出错
不知道说的是否正确,请指点。
xxxno 2004-02-03
  • 打赏
  • 举报
回复
呵呵,我回来看看
其实楼上说的 C专家编程 上有很详细的描述,大家可以看一下再来讨论
还有 C陷阱与缺陷 也不错
aryanli 2004-02-03
  • 打赏
  • 举报
回复
具体可以参看c prime plus的第10章 数组 部分,有详细的描述
leialen 2004-02-02
  • 打赏
  • 举报
回复
我来说两句,不知道对不对,探讨:


数组名是指向该数组首地址的指针,
二维数组array[n][m]是有n个长度为m的数组组成,
array[i]是指向数组的指针,

而我们知道,数组的首地址是不可改变的,即声明二维数组array[n][m]后,
array[i]的值是不可改变的。

是对于**p 则没有这个约束。
这时,可以:*p = array[i];因为赋值号两边表示的都是地址。
但是p和array则是两个不同的东西,虽然都是指向地址的地址,
但array又很强的条件约束,由于C++语法严格所以不能赋值
在标准C里有warning,C++里有error。

这个问题,如果反过来赋值,在哪都错。
可以参考<C专家编程>中关于const **p和**p的关系的解释。

欢迎讨论
BluntBlade 2004-02-02
  • 打赏
  • 举报
回复
倒……今天在外面跑了一天,累散了……明天吧。
longgw 2004-02-02
  • 打赏
  • 举报
回复
倒,很复杂,看都看不明白
up一下溜算了
benbebnmao 2004-02-02
  • 打赏
  • 举报
回复
bluntblade就等你的文章呢,hehe,你法出来后我就结贴!
期待ing!
zpsinz 2004-02-01
  • 打赏
  • 举报
回复
现在才知道自己的浅薄。。。。惭愧
BluntBlade 2004-02-01
  • 打赏
  • 举报
回复
不讨论,不能解惑……
xxxno 2004-02-01
  • 打赏
  • 举报
回复
我晕倒阿,还在讨论?
BluntBlade 2004-02-01
  • 打赏
  • 举报
回复
我回到桂林了,明天早上写一篇C的指针专稿贴上来!!
jiangfeng999 2004-02-01
  • 打赏
  • 举报
回复
5.*p2=array2[0]
gernal_dn 2004-02-01
  • 打赏
  • 举报
回复
int **p2;
int array2[9][9];
p2=array2;
array2是指向int[9]的指针,在C++中对类型的检验很严格,int[9]不能转换(指缺省的自动转换)成 int*,但是int[]可以转换成int*。或者可以这样说,C++认为int[]和int[9]是不同的类!int[9]定义了维度大小,是个新的类,int[]未定义大小,与int*等同。

boy8765 2004-02-01
  • 打赏
  • 举报
回复
标记。
ncsmt 2004-02-01
  • 打赏
  • 举报
回复
拷,你们真有专业精神.I服了U
_______________________
同意
meijing 2004-02-01
  • 打赏
  • 举报
回复


int**p 和int a[][]是不一样的,所以第五行是错的。但是如果作为函数参数的时候
int a[][] 会转化成int**.

论坛上以前有一篇这样的帖子讨论的很细。


加载更多回复(44)

69,373

社区成员

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

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