作用域:
static
内部连接,不允许被其他文件所引用.对于变量,只会被定义一次且只被初始化一次.
extern
外部连接,只是引用其他地方所定义的函数或变量.而且声明的外部变量不能被初始化.
隐式:
转换
对于不同精度的数据进行操作,低精度的操作数会隐式地转换成高精度类型.
声明
函数声明只是用来约束和规范函数调用的一个声明,同时它也有助于编译器的语法检测,当LD(连接器)进行连接时,充当符号连接被替换成编译地址的是函数在被调用时的名称.
指针:
类型
指针函数
int *(*(*fun(int ***p1[],int *(***p2[]))(void *(*p3)(int p4,int (*p5)()))(char (*p6[10])[10])[10];
函数指针
char *(*(*(*p)(int p1))(int p2)[10]))[10];
指针数组
void (*p[10])(int p1);
数组指针
int *(*p)[10];
函数调用
(*(void (*)())0)();
多维指针一般是指向多维数组
int ******p;
操作
星号操作符(*)返回的是指针所指向的"变量"本身,取址操作符(&)返回的是指向该变量类型的"指针"变量.
数组名
数组名一般可以以指针的形式操作数组变量,如果对数组名进行取址操作(&),将返回一个指向该"数组类型"的指针"变量",例如:int a[10]; &a<=>int (*a)[10].数组名只是一个单纯的地址标号,而数组则是一种类型.
宏:
##是连接符
#是转字符
结构:
大小
结构体里的属性的存放顺序影响着结构体的大小,它的大小总能被4字节整除,这种对其方式跟内存有关.当结构体嵌套结构体时,也跟定义的先后顺序有关.
其他:
sizeof会包含字符串的终止符'\0'
strlen则不会.
例如:char a[]="ABC";sizeof(a)=4;strlen(a)=3;
int a[]<=>int *a;
int a[][10]<=>int (*a)[10];
数组名不能做增量操作,例如:int a[10]; a++或a--;就不行.因为出现在表达式中数组名是指向他的数组元素的第一个元素的特殊指针.
C语言中,函数调用的参数压栈顺序是从右到左,因为C语言是cdecl风格的.
关于字符串,除了出现在字符数组中,例如char c[]={"Holle Word!"}.其他情况一律都放在只读段rodata中,也就是只读字符串.
阅读(902) | 评论(0) | 转发(1) |