A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© liu1170486003 中级黑马   /  2015-1-13 14:22  /  1510 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 liu1170486003 于 2015-1-14 23:09 编辑

sizeof第一发的地址
上代码:
  1. #include <stdio.h>

  2. int main(int argc, char *argv[])
  3. {
  4. double* a[10];
  5. printf("%d\n", sizeof(a));
  6. printf("%d\n", sizeof(*a));
  7. printf("%d\n", sizeof(**a));

  8. double* (*b)[10];
  9. printf("%d\n", sizeof(b));
  10. printf("%d\n", sizeof(*b));
  11. printf("%d\n", sizeof(**b));
  12. printf("%d\n", sizeof(***b));

  13. return 0;
  14. }
复制代码


输出:
40
4
8
4
40
4
8

评分

参与人数 1黑马币 +1 收起 理由
shixichen + 1 很给力!

查看全部评分

5 个回复

倒序浏览
在指针这块还真是有些烦恼呢
回复 使用道具 举报
指针的左右法则

指针数组,指向数组的指针
回复 使用道具 举报
首先:
        double *a[10];声明了一个数组a,数组内存放double类型的指针
        而由于我是用的32为的C编译器,所以一个指针所占字节数为4
        所以sizeof(a)就是计算数组a所占字节数的大小,返回值为4*10=40
        而sizeof(*a)计算的是a所指地址的内容所占的字节大小,即数组中第一个元素所占的

大小,也就是一个double指针所占的内存大小,所以返回值为4。
        而**a是取出a所指向地址中的元素,而这个元素是一个指向double类型数据的指针,所

以再取出这个指针所指的内容,即一个double类型数据,所以sizeof(**a)的结果就是double类

型数据的字节长度,返回值为8

        其实**a可以看成是*(*a),即取了两次地址内容

然后:
        double *(*b)[10];声明了一个指向类型为double *[10]的指针,而double *[10]又如

同上面的分析,是一个长度为10的数组,里面存放double类型的指针,所以总结起来就是double

*(*b)[10];表示一个指针b,指向长度为10的存放double类型指针的数组。
        所以sizeof(b)是求一个指针的长度,返回值为4
        sizeof(*b)是求指针b所指向内容,即一个长度为10的存放double指针的数组,结果长

度为10*4=40
        sizeof(**b)是求数组地址,也就是数组中第一个元素的地址所占字节数,其内容是一

个double类型的指针,所以返回值为4
        sizeof(***b)是求数组第一个元素所表示的double指针对应的内容,即一个double类型

的数据,所以返回值为8。

        double *(*b)[10];这句在理解上可以按照距离标识符b由近及远的顺序去逐步理解:
        ①首先是*b,这说明这里定义的是一个指针,即原语句就可以理解为:double *

(temp)[10],这里的b表示一个指针指向double *(temp)[10]所表示的内容;
        ②然后是double *temp[10],按照由近及远,是double *temp[10],为什么这样说?
        那么来个简单的例子:int a[10],这里a的类型是int类型长度为10的数组;
        另一个例子:int *a,这里a的类型是一个int型指针,那么我们就可以把int *看成是

一种特殊的类型,这种类型类似于int,表示的是一个int型指针
        综合上面两个例子,那么double *temp[10]表示的就是一个长度为10的数组,里面存放

double *类型的数据,即double型指针。
        根据①②两个步骤,可以总结出,double *(*b)[10];表示指针b指向一个存放了10个

double型指针的数组。

        呼!绕死我了!不过这个搞清楚了,第三弹应该就是小意思了吧。
       
       
回复 使用道具 举报
其实,上面只是我个人的理解,理解上还是有一些小错误的地方呢,不过对付这种不算太难的指针理解,已经够用了。真正应该掌握的方法是三楼说的右左法则(The right-left rule)。
The right-left rule:  
      Start reading the declaration from the innermost parentheses, go right, and then go left. When you encounter parentheses, the direction should be reversed. Once everything in the parentheses has been parsed, jump out of it. Continue till the whole declaration has been parsed.
翻译:
右左法则:
        从最里面的括号开始读指针的声明,先向右读,再向左读。当你碰到括号时,你应该掉头去读。一旦你分析完括号内的语句,那么就可以跳出括号,继续上面的方法阅读,直到分析完整个指针的声明。
具体用法可以参考博客:
http://blog.csdn.net/cattycat/article/details/5660353
回复 使用道具 举报
按照右左法则,[]的优先级比*要高
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马