c語言的標頭檔案 巨集 指標

2022-09-13 13:42:11 字數 3129 閱讀 7561

#include是檔案包含命令,主要用來引入對應的標頭檔案。#include的處理過程很簡單,就是將標頭檔案的內容插入到該命令所在的位置,從而把頭檔案和當前原始檔連線成乙個原始檔,這與複製貼上的效果相同。

#include有兩種使用方式:

#include #include "myheader.h"
使用尖括號< >和雙引號" "的區別在於標頭檔案的搜尋路徑不同:包含標準庫的標頭檔案建議用尖括號,包含自定義的標頭檔案建議用雙引號。

#define  巨集名  字串行

#表示這是一條預處理命令,所有的預處理命令都以#開頭。define是預處理命令。巨集名是識別符號的一種,命名規則和識別符號相同。字串行可以是常數、表示式等。

巨集定義的幾點說明

巨集定義只是簡單的字串代換,是在預處理完成的,而typedef是在編譯時處理的,它不是作簡單的代換,而是對型別說明符重新命名。被命名的識別符號具有型別定義說明的功能。

#define pin1 int *

typedef int *pin2; //也可以寫作typedef int (*pin2);

從形式上看這兩者相似, 但在實際使用中卻不相同。

下面用pin1,pin2說明變數時就可以看出它們的區別:

pin1 a,b;
在巨集代換後變成:

int *a,b;
表示a是指向整型的指標變數,而b是整型變數。然而:

pin2 a,b;
表示a、b都是指向整型的指標變數。因為pin2是乙個型別說明符。

由這個例子可見,巨集定義雖然也可表示資料型別, 但畢竟是作字元代換。在使用時要分外小心,以避出錯。

int a = 100;            a 是乙個變數,用來存放整數,需要在前面加&來獲得它的位址;

char str[20] = "abcdefg";         str 本身就表示字串的首位址,不需要加&

printf("%#x, %#x\n", &a, str);%#x表示以十六進製制形式輸出,並附帶字首0x

定義指標變數與定義普通變數非常類似,不過要在變數名前面加星號*,格式為:

datatype *name;

或者  

datatype *name = value;

*表示這是乙個指標變數,datatype表示該指標變數所指向的資料的型別 。例如:

int *p1;

p1 是乙個指向 int 型別資料的指標變數,至於 p1 究竟指向哪乙份資料,應該由賦予它的值決定。再如:

int a = 100;

int *p_a = &a;

在定義指標變數 p_a 的同時對它進行初始化,並將變數 a 的位址賦予它,此時 p_a 就指向了 a。值得注意的是,p_a 需要的乙個位址,a 前面必須要加取位址符&,否則是不對的。

1

//定義普通變數

2float a = 99.5, b = 10.6;3

char c = '

@', d = '#'

;4//定義指標變數

5float *p1 = &a;

6char *p2 = &c;7//

修改指標變數的值

8 p1 = &b;

9 p2 = &d;

*是乙個特殊符號,表明乙個變數是指標變數,定義 p1、p2 時必須帶*。而給 p1、p2 賦值時,因為已經知道了它是乙個指標變數,就沒必要多此一舉再帶上*,後邊可以像使用普通變數一樣來使用指標變數。

也就是說,定義指標變數時必須帶*,給指標變數賦值時不能帶*

指標變數也可以連續定義,如:int *a, *b, *c; //a、b、c 的型別都是 int*。

每個變數前面都要帶*。如果寫成int *a, b, c;

,那麼只有 a 是指標變數,b、c 都是型別為 int 的普通變數。

定義指標變數時的*和使用指標變數時的*意義完全不同。以下面的語句為例:

int *p = &a;

*p = 100;

第1行**中*用來指明 p 是乙個指標變數,第2行**中*用來獲取指標指向的資料。

需要注意的是,給指標變數本身賦值時不能加*。修改上面的語句:

int *p;

p = &a;

*p = 100;

第2行**中的 p 前面就不能加*

假設有乙個 int 型別的變數 a,pa 是指向它的指標,那麼*&a&*pa分別是什麼意思呢?

*&a可以理解為*(&a)&a表示取變數 a 的位址(等價於 pa),*(&a)表示取這個位址上的資料(等價於 *pa),繞來繞去,又回到了原點,*&a仍然等價於 a。

&*pa可以理解為&(*pa)*pa表示取得 pa 指向的資料(等價於 a),&(*pa)表示資料的位址(等價於 &a),所以&*pa等價於 pa。

在我們目前所學到的語法中,星號*主要有三種用途:

int aa = 97;

int bb = 98;

int *paa = &aa;

printf("%c\n",*paa);

*paa = 99;

printf("%c\n",paa);

paa = bb;

printf("%c\n",paa);

執行結果   a   c   b

C 標頭檔案 巨集 編譯問題

2019 02 15 小記 c 標頭檔案的防重複包含是針對同乙個原始檔而言 原因 include 標頭檔案就是一段 的拷貝,標頭檔案中若有型別定義等,重複包含就會造成編譯錯誤,若無型別定義等不造成重複定義的,則無需防重複包含機制 防重包含機制 pragma once ifndef macro def...

C語言的標頭檔案

1.在c檔案中在函式外部宣告變數,稱為為全域性變數。1 全域性變數如果加static關鍵字,表示只能在本檔案內訪問,而且只能從宣告處到檔案末尾的範圍內訪問。宣告時如果沒有初始化,會自動初始化乙個值,例如static int x,x預設值為0。如果a 函式中用到變數x,而x的定義 static int...

C語言的標頭檔案

標頭檔案 a.h ifndef a h define a h 定義方法,不提供實現 int add int a,int b endif add.c include a.h 實現標頭檔案a中定義的方法 int add int a,int b main.c include include a.h 若想在...