c语言笔记
高级用法
contain_of
#define container_of(ptr, type, member) \
do { \
typeof(((type*)0)->member) * mptr = (ptr);\
(type*)((char*)mptr - offset(type, member)) \
}while(0);
关键字
static
- 表示存储状态 : 带static的变量在进程活着时 一直有效
- 表示作用域 : 作用在函数或变量时,表示其他文件无法访问
sizeof
sizeof(type) sizeof(var) sizeof var
都可以
- 作用在基本类型如char, int时,大小就是其实现的大小,如1, 4
- 作用在指针时,就是其实现大小,如64位,8字节
- 作用于数组时,是整个数组占用字节数
- 作用于Union时,表示最大字节数
extern
声明变量或函数为外部变量
注意即使在同一个文件中,在文件后半部分定义的,在文件前半部分使用也不行
extern int num = 3
这种写法是错的,应该写为extern int num
typedef
给已存在类型取别名 typedef oldName newName;
typedef struct student {
// ...
} Stu, *Stu_p;
struct student 等同 Stu
struct student * 等同 Stu*, Stu_p
typedef char ARRCH[20]
ARRCH 等同于 char[20]
ARRCH a, b 等同于 char a[20], b[20]
更多阅读
C语言typedef:给类型起一个别名
函数与指针
函数指针与函数声明一样,只需要简单修改一下如下:
void myFunc(int);
void (*Func)(int); // 申明一个函数指针变量,变量名是Func
typedef void (*FuncType)(int); // 定义一个函数指针类型,类型名为FuncType
void myFunc(int x) {
//...
}
Func = myFunc; // 正确
FuncType f = myFunc ; // 正确
更多阅读
c/c++ 函数指针的用法
数组与指针
指向数组的指针 与 指针数组
char *p[20]
与 char (*p)[20]
两者区别??
[]
优先级高于*
,所以前者是定义了一个变量数组p,其元素是char*类型;而后者是定义了一个指针变量p,其指向包含20个元素的char数组。
extern 数组
a.c中定义char arr[20]
,b.c中extern char* arr
可以吗??
不可以,指针就是指针,数组就是数组,不一样的类型
数组
int arr[5]
,arr
、&arr
和&arr[0]
作为右值时表示什么
&arr
表示数据地址,另外两个表示数组首元素地址
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int* ptr = (int*)(&a + 1);
printf("%d, %d\n", *(arr+1), *(ptr-1));
}
输出是啥
2, 5
内存管理
int arr1[128] = {0}; //全局变量
int arr2[128] = {1}; //全局变量
int arr3[128] = {}; //全局变量
int a;
int b = 0;
static int c;
static int c = 1;
int main(){
int arr4[5] = {0};
int arr5[5] = {1};
int arr6[5] = {};
int arr7[5];
return 0;
}
数据分为bss和data两个段,前者存储代码中没有初始化的全局变量和静态变量,并为之赋值0;后者存储代码中主动赋值了的全局变量和静态变量.