C语言的程序片段:

 

p = 0;

printf(
"%d\n%d\n", p, p+1);

结果会是什么呢?

0

呵呵,上当了吧,此题是无解的,因为我没说p是什么东西。下面我告诉你p是什么:

 

int (*p)[1024];
p
= 0;

printf(
"%d\n%d\n", p, p+1);

 

 

结果是:

0

4096

这个结果对么?

不一定。还得看它的运行平台。上面的结果是32位Intel平台的,64位的呢?单片机呢?DSP呢?

欢迎有条件的朋友试一试。

最后来个完整的:

 

#include <stdio.h>

int main()
{
int (*p)[1024];
p
= 0;
printf(
"%d\n%d\n", p, p+1);
printf(
"%d\n%d\n", (int)p, (int)p+1);
printf(
"%d\n%d\n", (int)p, (int)(p+1));

return 0;
}

 

 

 结果是:

0
4096
0
1
0
4096



Posted on 2010-03-31 00:23 Soli 阅读(295) 评论(4) 编辑 收藏

Feedback

#1楼  回复 引用 查看   

2010-03-31 09:58 by stuarts      
楼主解释下!

#2楼[楼主]  回复 引用 查看   

2010-03-31 22:20 by Soli      
引用stuarts:楼主解释下!


不好意思,我以为大家一看结果就都明白了呢

如果这样定义P应该好理解一点吧:

int p[10][1024];

那p+1就相当于p[1],距离p前进了1024个元素,每个int是4个字节

所以p[1]比p大了4*1024。

第二个打印语句里,p被强制类型转换成了int,所以它的表现就应该像个int,这无需多说了。

第三个打印语句,理同第一个。

其实第一个打印语句中编译器会有一个隐式的类型转换,和第三个打印语句效果一样的。

还有什么要讨论的,欢迎留言哈。

#3楼  回复 引用 查看   

2010-04-05 12:07 by stuarts      
int (*p)[1024];
这是数组指针,对吗?
如果变成
int *p[1024];
这个又是什么呢?
请楼主指教?
我好像一直没弄清楚数组指针和指针数组的区别,

#4楼[楼主]  回复 引用 查看   

2010-04-05 15:59 by Soli      
int *p[1024];
是指针的数组

这个数组有1024个元素,每个元素都是一个指向int型的指针

你可以以变量名为起点“先右后左,括号优先”地解读变量的声明。

必如上面这个:
p是变量名,先右,“[”说明它是个数组,然后找到与“[”的匹配的另一半“]”,中间是1024,则说明它含有1024个元素;
再看左边,“*”说明它的元素是指针类型的;
再看右边,右边已经没有了;
再看左边,“int”说明指针是指向int型的。
亦即:p是一个数组,它包含1024个元素,每个元素是个指针,它(该指针)是指向int型的。

再看
int (*p)[1024];

p是变量名,先右,右边“)”是一对括号的右半部分,所以继续;
再看左边,“*”说明它是个指针,至此括号内的已经解读完,把括号内的内容看做整体,继续;
再看右边,“[”说明它(括号中的全部内容)是个数组,然后找到与“[”匹配的另一半“]”,中间是1024,则说明它含有1024个元素;
再看左边,“int”说明它的元素是int型的。
亦即:p是个指针,它指向一个数组,该数组包含1024个元素,每个元素是个int型数据。

推荐一本书,《C专家编程》,这个方法在上面有讲。
欢迎在小组里继续讨论。