打印

搞到今天都没弄懂的C语言问题...

[复制链接]
13694|69
手机看帖
扫描二维码
随时随地手机跟帖
楼主
冷漠| | 2010-2-26 10:07 | 显示全部楼层 回帖奖励 |倒序浏览
本帖最后由 冷漠 于 2010-2-26 10:12 编辑
如果一个数组如下定义:
int a[10];
那么找个指针指向它只要int *p = a;就定义完成了...可以理解为“一个指向有10个整形数组的指针”
同样,有如下定义:
int (*p)[10];
该定义含义也是“一个指向有10个整型数数组的指针”,这个定义有点让我莫名其妙...写了那么多的C我还真没见过谁这么用的,



唉!中国的教授确实多数没把这个问题讲清。
1、int (*P)[10]和int a[10]的差别: a 是指针常量,也就是说:a只能固定指向所说明的那个(唯一)数组。但是P是指针变量,P不仅可以指向a 数组,还可以指向其它任何同类型数组,例如指向int  b[10]。
2、int   *P[10]; 和上面int  (*P)[10]; 的差别已经很清楚了:上面叫做“数组的指针”;下面叫做“指针数组”。变换一下写法就清楚了:在一定条件下:
         *P <——> P[ ]
老师没教?书上也写了。 所以:

char   *P[10];——>char   P[ ][10];  // 二维数组就是个指针数组。字符串数组中很常用的写法。

所以,把凡是C语言关于“字符串”用法的教材内容都找来看一遍,就不再陌生了。
还有:......能提出如此问题,已经高人一筹了,......

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
zq1987731 + 1
沙发
冷漠| | 2010-2-26 11:48 | 显示全部楼层
本帖最后由 冷漠 于 2010-2-26 13:31 编辑
int A[10];  // 实际分配一个含10个int单元的数组
int (*p)[10];  // 定义一个指针,注意尚未有实际空间被指定


同意上面差别。那么下面概念/写法一定是对的:[ ]左傍指针——[ ]左边必是指针,所以:
         *P是指针,P[ ]是指针,A是指针,(*P)也是指针。所以:
          *P=A ;——>   P=&A; /  P=A;  // 概念上一样。既然编译结果唯一,自然2种写法都可以。

使用特权

评论回复
板凳
冷漠| | 2010-2-26 16:41 | 显示全部楼层
我keil C51 编译通过.

使用特权

评论回复
地板
冷漠| | 2010-2-26 20:21 | 显示全部楼层
个人看法:最重要的一点:A是常量指针!它的地址是一个常数。一个常数是包含在程序里的吧?例如:MOV A,#55H; 这个55H是跟着语句跑的吧,它有地址特征吗?它需要间接寻址吗?

使用特权

评论回复
5
冷漠| | 2010-2-27 11:30 | 显示全部楼层
*p_u8_sampleXY[0]  = u8_sampleXY[0][0]=1;
*(p_u8_sampleXY+1)[2]  = u8_sampleXY[1][2]=1;
*(*(p_u8_sampleXY+1)+1)  = u8_sampleXY[1][1]=2;



写清楚呀:
*u8_sampleXY[0]  = u8_sampleXY[0][0]=1;
*(u8_sampleXY+1)[2]  = u8_sampleXY[1][2]=1;
*(*(u8_sampleXY+1)+1)  = u8_sampleXY[1][1]=2;

使用特权

评论回复
6
冷漠| | 2010-3-5 09:37 | 显示全部楼层
哈!再饶舌一下。A不能叫常量,——A叫做“指针常量。”
指针是一个地址。所以一个指针,只能作为“左值”使用。例如:
A=&A[0];   //正确写法

所以下面写法有语法问题:
P=A;     //地址A 成了右值。
但实际中为什么可以这么写?HWM 讲过了。编译器认为没问题。它有它的道理。

P=A;和  P=&A;编译结果一样。
把警告级别降低就不会出现警告提示了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则