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;后者存储代码中主动赋值了的全局变量和静态变量.

C语言的内存布局(详细分析变量在.bss和DS段的分布)

posted @ 2020-09-02 16:29  holidays  阅读(152)  评论(0编辑  收藏  举报