关于变量类型
for (int i = 0; i < 10; i++) {
static int a = 10;
a++;
printf("%d\n", a);
}
// >11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
for (int i = 0; i < 10; i++) {
int a = 10;
a++;
printf("%d\n", a);
}
// >11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
这是因为, static 只会初始化1次,无论它在哪
关于指针
二级指针避免内存泄露
错误的代码
void tst(char *i) {
i = malloc(100); // 这个 i 运行完毕后被清空了
}
int main() {
char *p = NULL;
tst(p);
strcpy(p, "hello"); // 这个 p 仍然为0
free(p); // 释放不是 malloc 分配的内存
return 0;
}
正确的代码:用二级指针
void tst(char **i) {
*i = malloc(100);
}
int main() {
char *p = NULL;
tst(&p);
strcpy(p, "hello");
free(p);
return 0;
}
零碎知识
char a = '\72'; // 表示 8 进制的ascii码
char s[5] = {"abc"}; // 也是合法的
int *a, b; // a 是个指针,b是int类型
int (*p)[5]; // 指针指向一个长度为5的整形数组
int *p[5]; // 定义一个长度为5的数组,数组的元素都是指针
进阶
数组名不是指针
int arr[] = {1, 2, 3, 4, 5}; // arr 是数组名
int *p = (int *) &arr; // p 是指针
printf("%ld != %ld\n", sizeof(arr), sizeof(p));
// 1. 一个是数组的大小,为4*5;一个是指针的大小,为8
// 2. +1后的指向不同
printf("%p,%p\n", p, p + 1);// +1移动一个int
printf("%p,%p", &arr, &arr + 1); // +1移动5*int
// 3. 数组名是指针常量,不可更改
// arr = NULL; //错的
指针作为入参
int func(int arr[]){ // 等价于 int *arr
}
typedef