1. 程式人生 > >c語言讀書筆記

c語言讀書筆記

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;

這裡寫圖片描述