c語言的頭文件、宏、指針


#include命令

#include是文件包含命令,主要用來引入對應的頭文件。#include的處理過程很簡單,就是將頭文件的內容插入到該命令所在的位置,從而把頭文件和當前源文件連接成一個源文件,這與復制粘貼的效果相同。

#include有兩種使用方式:

#include <stdio.h>
#include "myHeader.h"

使用尖括號< >和雙引號" "的區別在於頭文件的搜索路徑不同:包含標准庫的頭文件建議用尖括號,包含自定義的頭文件建議用雙引號

  • 一個#include命令只能包含一個頭文件,多個頭文件需要多個#include命令。
  • 文件包含允許嵌套,也就是說在一個被包含的文件中又可以包含另一個文件。

宏定義

#define  宏名  字符序列

#表示這是一條預處理命令,所有的預處理命令都以#開頭。define是預處理命令。宏名是標識符的一種,命名規則和標識符相同。字符序列可以是常數、表達式等。

宏定義的幾點說明

  • 宏定義是用宏名來表示一個字符串,在宏展開時又以該字符串取代宏名,這只是一種簡單的替換。字符串中可以含任何字符,可以是常數,也可以是表達式,預處理程序對它不作任何檢查,如有錯誤,只能在編譯已被宏展開后的源程序時發現。
  • 宏定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起替換。
  • 宏定義必須寫在函數之外,其作用域為宏定義命令起到源程序結束。如要終止其作用域可使用#undef命令。#define  A  123  #undef  A    A只在從定義到undef之間有效


宏定義表示數據類型和用typedef定義數據說明符的區別。

宏定義只是簡單的字符串代換,是在預處理完成的,而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是一個類型說明符。

由這個例子可見,宏定義雖然也可表示數據類型, 但畢竟是作字符代換。在使用時要分外小心,以避出錯。http://c.biancheng.net/cpp/html/65.html

 

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 //定義普通變量
2 float a = 99.5, b = 10.6;
3 char c = '@', d = '#';
4 //定義指針變量
5 float *p1 = &a;
6 char *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 的普通變量。


 

 

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

  1. int *p = &a;
  2. *p = 100;

第1行代碼中*用來指明 p 是一個指針變量,第2行代碼中*用來獲取指針指向的數據。

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

  1. int *p;
  2. p = &a;
  3. *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 a = 3, b = 5, c;  c = a * b;,這是最容易理解的。
  • 表示定義一個指針變量,以和普通變量區分開,例如int a = 100;  int *p = &a;
  • 表示獲取指針指向的數據,是一種間接操作,例如int a, b, *p = &a;  *p = 100;  b = *p;

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM