C语言知识点(1)------数据声明
1、& 和 | 不同于&& 和 ||
& 和 |:是按位运算符
&& 和 ||:逻辑运算符
我们常常在if判断语句中使用,基本上没出现过问题,是因为我们判断的结果都是0和1,所以按位运算和逻辑运算结果一样;
if(i == "1" && j == "2")和if(i == "1" & j == "2")运行结果相同
但是如果是在平时的运算而不是逻辑判断中就会大不相同;
i = 8;
j = 4;
k1 = i || j; //12
k2 = i | j; //1
2、数据声明(这是一个难点,很多一知半解的人搞不清楚,很考指针,在面试题中也经常遇到)
a) 一个整型数
b)一个指向整型数的指针
c)一个指向指针的的指针,它指向的指针是指向一个整型数
d)一个有10个整型数的数组
e) 一个有10个指针的数组,该指针是指向一个整型数的。
f) 一个指向有10个整型数数组的指针
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
答案:
int a;
int *a;
int *(*a);
int a[10];
int *a[10];
int (*a)[10];
int (*a)(int);
int (*a[10])(int);
ps:不理解的可以在看下面的指针学习再来看看。
这两个知识点刚刚开始看到会出现一脸懵逼的感觉,但是仔细琢磨你可以学习到很多,让你在指针研究上很深一步的了解。
2、函数声明:
解释(* (void (*)()))0)();
首先具备的知识:
如何声明一个类型和指针类型
变量声明
float f,g; // 是声明f/g为float类型
则 float ((f)); //是声明f为float类型,括号并不影响
float ff(); //是返回一个float类型的函数。
float *pf; //说明*pf就是float类型,而pf就是指向float的指针,也就是指向地址。float* pf; //与上一个是一样的表示
函数声明
float *pf(); //表示函数返回值为一个指向float的指针(指针函数);也可以这样表示float *(pf()) ;= float *( PF );// PF = *pf ;
float (*ph)();//ph是一个函数指针(还是一个指针),是指向函数的指针,函数的返回值为float;
(float (*)()) 或者(float (*void)())表示一个返回值为float类型的函数的指针的类型转换符(与int类型,是一个声明);
分析(* (void (*)()))0)();可知(void (*)()))与上述一致,不过返回值为float,当typedef (void (*)())) V;
则原式子为 (* V 0)()
V 0表示把0的类型强制转换为V型
相当于(*pf)();
可以看出这是在调用函数(相当于(*fun)();).
3、指针学习
用优先级规则分析下面例子:
char * const *(*next)();
1、从next可以看出,这是一个函数的函数名,
2、(*next)()知这是一个函数指针
3、const *(*next)()返回值是*const,也就是说,返回值是一个指针;
4、char *可知,const指针指向的是一个指向char的指针;
总结:是一个指向函数的指针(函数指针),函数返回一个指针,改指针指向一个只读的指向char的指针
反过来就可以推数据声明的题目了。
这是《C专家编程》里面的学习声明类型方法可以学习一下,能理解最后,不能就算了,就一个一个来分析。
练习1:a+++++b是什么含义