歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> Linux C 第八課

Linux C 第八課

日期:2017/3/3 11:13:00   编辑:Linux技術

關鍵字

register register的作用是請求編譯器盡可能將變量保存在CPU的內部寄存器中,這樣做的好處是省去了CPU從內存中讀取數據的時間,從而提高了程序的運行效率。通常情況下,我們將頻繁被訪問的變量設置為寄存器變量。使用register關鍵字要注意一下幾點:一、register只能修飾局部變量不能修飾全局變量,因為全局變量可以被多個進程訪問,如果設為register變量,只有當前進程知道變量的位置,其他進程都不知道;二、不能用 & 來獲得register變量的地址,如果用& ,獲得的地址時內存的地址;三、register修飾的變量類型一定要是CPU所能接受的類型。

static

static的作用有三點:一、static修飾局部變量,稱為靜態局部變量,延長了局部變量的生命周期,使得該變量在整個程序運行結束後再釋放;二、static修飾全局變量,稱為靜態全局變量,只能在本文件中訪問,不能再其他文件中訪問;三、static修飾函數,稱為靜態函數,只能在本文件中調用,不能再其他文件中調用;當一個文件中同時出現了非靜態函數和靜態函數,一定要將靜態函數定義在非靜態函數之前,或者在非靜態函數前先申明靜態函數,然後在後面定義靜態函數。

另外,靜態變量存儲在虛擬地址空間的 .data 段,沒有初始化時,系統默認初始化為零。

使用static的三種情況:一、當我們希望延長局部變量的生命周期時,用static修飾局部變量;此時靜態局部變量的作用與全局變量相同,但靜態局部變量比全局變量更加安全;二、當我們想讓全局變量只能在本文件中可訪問,或者想修改重定義全局變量的時候,使用static修飾全局變量;三、當我們想讓函數只能在本文件中可調用,使用static修飾函數。

const

const修飾變量稱為只讀變量,不能通過const修飾的變量名來修改對應空間的值;使用num修飾變量,一定要進行初始化;const修飾形參,可以避免在函數實現過程中修改實參的值。

const的修飾准則:近水樓台先得月,離誰近,就是修飾的誰

例:

[code] const int num = 5;//const 修飾 num,不可以num++;但可以通過其他方式改變  num對應空間裡的值;
const int * p = #//const 離*p更近,不能通過*p修改num對應空間的值(*p)++;
int const * p = #//const 離*p更近,不能通過*p修改num對應空間的值(*p)++;
int * const p = #//const 離p更近,不能通過p修改num對應空間的值p++;
extern

extern 是外部聲明,在當前文件中要使用其他文件中定義的全局變量或者函數,就要再當前文件中聲明要使用的變量或者函數。

typedef

typedef 給基本數據類型進行重命名,提高了代碼的移植性,將復雜的數據類型名變為簡答的名字,方便編寫程序,同時,也方便我們定義變量,對變量起到了注釋的作用。

復合數據類型

struct 結構體struct的作用:封裝數據,把不同數據類型的數據放在一起

struct student stu;//定義結構體變量

結構體變量 . 結構體成員

結構體指針 -> 結構體成員

*字對齊和半字對齊

字對齊:給每個結構體成員分配4個字節的空間

半字對齊:給每個結構體成員分配2個字節的空間

定義結構體數據成員的時候盡量把同類型的數據放在一起以減少內存空洞

*函數如何返回多個值

①使用傳入參數

②返回結構體變量

sizeof(struct student) 由所有成員的長度之和決定

union 共用體

訪問與結構體一樣

sizeof(union )由成員中最長的決定

所有的成員公用一個空間會產生覆蓋

*大端字節序和小端字節序

int num = 0x12345678;

其中,12為高字節,78為低字節

小端存放 :將低字節存放在低地址中

大端存放 :將高字節存放在低地址中

驗證CPU是大端存放還是小端存放

利用共用體的空間覆蓋性

[code]#include<stdio.h>

union demo
{
    int num;
    char ch;
};

int main()
{
    union demo demo1;
    demo1.num = 0x12345678;

    char *p = #

    if(demo1.ch == 0x78)     //if(*p == 0x78)
    {
        printf("小端存放\n");
    }
    else
    {
        printf("大端存放\n");
    }

    return 0;
}
enum 枚舉

訪問:

[code]printf("p.A = %d\n",A);

enum node p = A;
printf("p.A = %d\n",p);
枚舉相當於整數宏

int len = 3;//3 是幻數,數字沒有解釋能力

①宏用來定義常量與命令(避免幻數) ②語句的末尾沒有 “;”

③宏函數(函數式宏定義)

宏函數是傻瓜式替換,不做語法檢查,不安全,但效率高

自定義函數,做語法檢查,安全,但效率低

用編譯時間換內存空間的例子(用時間換空間):宏函數

用內存空間換運行時間的例子(用空間換時間):inline函數(內聯函數、內嵌函數)

④內置宏定義

[code]printf("%d\n",__LINE__);
printf("%s : %d",__func__,__LINE__);
// __DATA__,__TIME__

條件編譯

①注釋一大段代碼 用

[code]#if 0  
...
#endif
②防止頭文件重復包含帶來的重復定義

[code]#ifndef A_H
#define A_H
...
#endif
判斷 bool 值

[code]if(flag)
//if(!flag)

Copyright © Linux教程網 All Rights Reserved