文章参考微信公众号[嵌入式软件学习圈]

四、C语言复杂表达式

4.1、在表达式中,要看符号的优先级和结合性。

4.2、在理解内存时,内存0地址在最底下,至上地址逐渐增加。

4.3、int *p;是定义的一指针变量p,而int (*p)[4];也是一个指针变量p;也可以这样想:凡是遇到(*p)什么的判断他是指针后,就可以说他是指针变量,包括函数指针。

4.4、一个函数int max(int a, int b);则他的函数指针是int (*p)(int, int);其意思就是定义这个类型的函数指针变量p; p=max是赋值,引用是p();则相当于max()调用这个函数。函数指针必须和原函数的类型一样。

4.5、函数指针其实就是为了做结构体内嵌指针的,这样就构成了高级语言中的类。再一个就是上述4.4中p=&max;也是可以的,它和p=max,值和意义都是一样的,这个和数组有所区别,数组的a和&a的值虽然一样,但是意义完全不一样。int a[4];a有两层意思,第一层是数组名,&a表示整个数组的地址,第二层表示首元素的首地址。

**4.6、int (*p[4])(int, int)其意思是函数指针数组,一个4长度的数组,里面存了4个函数指针。

4.7、printf在做输出时,其机制是缓冲行来输出,即当遇到一个\n后再打印出来,即使再多printf,没有遇到\n,都不是一个一个打印。

'\r'是回车,'\n'是换行,前者使光标到行首,后者使光标下移一格,通常敲一个回车键,既是回车,又是换行(\r\n)。Unix中每行结尾只有“<换行>,即“\n”;Windows中每行结尾是“<换行><回车>”,即“\r\n”;Mac中每行结尾是“<回车>”。scanf("");里面不要加\n符。

4.8、在一个c文件中,有时候会多次引入一个.h文件,所以在写.h文件时,要写

#ifndef _FINE_
#define _FINE_
XXXXXXX
XXXXXXX
#endif

4.9、typedef int* intType; const intType p;,其意思是指针p为const;

4.9.1、对于typedef的定义:如typedef const int cdw;可以这样理解,typedef就是给一个类型区别名的,那么系统会自动识别该类型,如果typedef const int char则就报错。

4.9.2、在开发中经常会typedef int int32_t; typedef short int16_t;这样做的目的是便于在不同平台下的移植,如果当在另一个平台下,int是64位的,但是我的项目中都是用的int 32_t;所以只需要修改int32_t就可以了,我可以让他typedef short int32_t;这样我只更改一次,其余的都改了,做到一改全改。

4.9.3int **p; int *a[4]; p=a;可以这样理解:首先它是指针数组,既然是数组,则a即表示数组名又表示首元素的首地址,a[0]是一个一重指针,而a是a[0]的地址,那么a就是一个二重指针;一重指针的地址就是二重指针变量,所以有p=a;而int a[4][3],a和一维数组的意思是一样的,如int a[3][6], int *p; p=a[0];所以不能p=a, int *a[3][3], int **p; p=a[0];

4.9.4、二维数组是为了简化编程,平面型。数组以下标方式访问其实是编译器封装起来的,实质是指针访问。int (*p)[5]; int a[2][5];则有p=a;关键是要把二维数组抽象成n行n列用指针访问方式理解:二维数组可以看作是一个方格子的矩阵,比如a[2][5],那么就是2行5列的10个小格子,第一行可以收纳起来变成一个指向一维数组的指针,第二行也是如此;

这样收纳后就变成了一个新的数组a[2],每一个格子存放的是它收纳的第一个元素的地址,如a[0]存放的是第一行第一列元素的地址,a[1]存放的是第二行第一列的地址;

再与一维数组相联系,一维数组名即表示数组名又表示数组第一个元素的地址,所以a[2][5]中的a表示a[2]数组第一个元素的地址;那么再把p=a;层层推递,(p+i)表示指向第几行的地址,(p+i)表示取第几行的值(而这个值存放的是第几行一列元素的首地址),(p+i)+j表示指向第几行第几列的地址,最后在引用这个地址,(p+i)+j)就表示第几行第几列的值了。

一重指针----------->一维数组

二重指针----------->指针数组

数组指针----------->二维数组

函数指针----------->普通函数


往期文章列表:****往期热文:
基础C语言知识串串香(1)

基础C语言知识串串香(2)

基础C语言知识串串香(3)

基础C语言知识串串香(4)

基础C语言知识串串香(5)

基础C语言知识串串香(6)

基础C语言知识串串香(7)

基础C语言知识串串香(8)


===========我是华丽的分割线===========


更多知识:
点击关注专题:嵌入式Linux&ARM

或浏览器打开:https://www.jianshu.com/c/42d33cadb1c1

或扫描二维码: