[备忘] 重温十年前的C基础 - 类型声明和变量定义

const , 指针, 数组, 函数 加在一起, 我就不信搞不晕你!!

话说: 搞晕了又怎样, C/C++编程在经历了"奇淫异术"的混乱时代后, 大家都已经充分地认识到: "人生苦短, 何必要折磨自己和别人呢", 象 表达式 优先级, 这类无聊的东西, 我们是不会记得.

但是今天要讲的这个, 不记不行, 因为这就是C语言, 关于愤怒的话就不说了, 因为经典的C 语言书, 都有不少篇幅说 C 语言语法设计是怎么一个烂!!

这就是晕,说也说不清楚, 这就是晕, 糊里又糊涂.

C 语言声明语法设计的主要原则: 让声明和使用尽量一致

char *p; //忘记Java, 不要用 char* p;
            //说到底 首先强调的是: p 是一个指针, 所以 * 应该和p靠近. 
            //我发现: 理解C变量声明: 数据类型最不重要, 而变量名是阅读的起始点
            //从"声明和使用一致" 的角度也可能解释:  我们会使用 *p

int const a; //忘记Java, 这种是标准写法.  
                //老的写法 const int a, 很多情况下, 会让人更晕 
                // a是主角, 我们是想让a不能变, 并不是说让a的类型必须为int, 所以让const和a靠近

int * const p1; 
//"声明和使用一致" 原则: 
*p1 = 3; //OK
p1 = &b; // 不行, 因为声明中 p1 前有const修饰, 不能改动

int const *p2;  
//"声明和使用一致" 原则: 
*p2 = 3; // 不行, 因为声明中 *p2 前有const修饰, 不能改动
p2 = &b; // OK

在讲指针和数组组合关系前, 先看一个因为想当然而出错的问题:

int a[][3] = { {1,2,3},{4,5,6} };
int **p1 = a; //不行!!!!, 不行!!!!, 不行!!!! 
//我的理解, 就个就相当于声明 int p1[][] = xxx; 多维数组只能是最高维不确定, 其它维必须确定长度

int (*p2)[3] = a; //应该用数组指针, 这处的括号必须有, 因为[]号的优先级高
int (*p3)[3] = &a[0];  //[]号的优先级高

前面的例子引出了 指向数组的指针, 这个非常符合 "声明和使用一致" 原则:

int a[][3]={ {1,2,3},{4,5,6},{7,8,9}};
int (*p)[3] = a;
(*p)[1] = 777;//相当于改a[0][1]
(*(p+2))[1] = 888;//相当于改a[2][1]
p[2][2] = 111;//相当于改a[2][2]

说完 指向数组的指针, 另一个经常和它相比较的就是 指针数组, 就是一个数组, 每个组员都是指针

int a,b,c;
int *p[3]; 
p[0] = &a; 
p[0] = &b; 
p[0] = &c;  

函数与指针:

// 声明一个函数
int func(int x){
       xxxx;    
}
int (*f) (int x); // 声明一个  函数指针 
f=func;  //将func函数的首地址赋给指针f 
int a = (*f)(3); //使用 函数指针

最后来个综合:

int (*op[2])(int a,int b); 这个是什么东东?

第一步: 找到变量名 op
第二步: op[2], 因为[]的优先级比*高, 说明 op 是一个数组, 接下来再看这个数组成员内容是什么
第三步: *op[2], 前面有个*号, 证明 数组成员是 指针, 接下来再看, 这个指针指向什么
第四步: (*op[2]), 遇到了括号, 接下来准备看右边, 这就是很著名的,  先右后左的 分析原则 
第五步: (*op[2])(xxxx), 后面跟了一个双括号, 证明是 指针指向 的是一个函数, 也就是说是函数指针
第六步: (*op[2])(int a, int b)  函数的形参
第七步: int (*op[2])(int a,int b), 最前面的 int 是这个函数的返回类型

smithfox | Wednesday 30 March 2011 at 3:42 pm | | system       

One comment

Gucci iPhone 6 Cases

We can expect the iPhone 7 to have a 4.7in screen (and the iPhone 7 Plus should Apple decide to launch one to have a 5.5in display), a rounded, aluminium chassis and a very slim profile. It’s also likely that it’ll be available in Silver, Gold and Slate Grey.

Gucci iPhone 6 Cases, (URL) - 04-06-’15 14:06
(optional field)
(optional field)
为阻止垃圾广告, 请在提交评论前, 回答一个简单问题(Please answer an simple question)
Remember personal info?
Notify
Small print: All html tags except <b> and <i> will be removed from your comment. You can make links by just typing the url or mail-address.