欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c语言读书笔记

程序员文章站 2022-07-14 20:45:33
...

c语言知识

引自《c专家编程》

1.c语言数据类型
c语言读书笔记

short -- short int(短整型)
long -- long int(长整型)

2.switc 中的 break 到底中断了什么?

switch(line) {

    case THING1:
        doitl1();
        break;
    case THING2:
        if (x == STUFF) {
            do_frist_stuff();
        if (y == OTHER_STUFF) {
            break;
            doinl2();
        }
        //代码break的意思是跳到这里
        init_module_pointer();
        break;
    case THING3:
        ...

        }

}

上面的代码是想跳出if然后继续执行init_module_pointer()但是并不是这样,而是直接跳出了switch并未初始化


c 语言中的const只是类型约束,并非真正的常量

void func(void)
{
    const int a;
    switch() {
        case a:
            ...
        break;
            ...
        default:
            ...
        break;
    }
}

这样是会报错的,因为a并非真正的常量,case后需要跟常量

3.c 语言函数中buf的传递

char *getTime(void)
{
    char buf[120] = {0};
    ...
    获取time
    ...
    strcpy(buf, timebuf, 120);

    return buf;
}

在上面的这种用法中获取time并打印后获得的值是错误的,因为在栈中自动分配的buf在函数调用结束后就会被释放,所以我们实际得到的缓冲区指针早已不知指到了哪

/*或许我们可以用malloc的方式获得一块buf, 但是这样需要自己来管理内存,很容易出现忘记free的情况*/
char *getTime(void)
{
    char *buf;
    buf = malloc(120 * sizeof(char));
    ...
    获取time
    ...
    strcpy(buf, timebuf, 120);

    return buf;
}

所以我们可以引用一些标准函数的方法,让用户自己传入buf

static char *getTime(char *buf, int len)
{
    /*传入长度以做一些判断,看长度是否够用*/
    ...
    获取time
    ...
    strcpy(buf, timebuf, 120);

    return buf;
}

int main(int argc, char **argv)
{
    char buf[120] = {0};

    getTime(buf, sizeof(buf));
    return 0;
}

char *ptr = “Hello World!”; //字符串指针是常量,不可重新赋值

4.数组和指针并不相同
1>定义和声明的区别

定义只能有一次,比如 int a;
声明可以多次声明,比如在其他文件中引用变量 extern int x;

c语言读书笔记