【C】一些特性

2021年12月18日    Author:Guofei

文章归类: 语言    文章编号: 10010


版权声明:本文作者是郭飞。转载随意,但需要标明原文链接,并通知本人
原文链接:https://www.guofei.site/2021/12/18/c_more.html

Edit

关于变量类型

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


您的支持将鼓励我继续创作!
WeChatQR AliPayQR qr_wechat