typedef和define具體的詳細區別

PengPengBlog發表於2017-03-21
1) #define是預處理指令,在編譯預處理時進行簡單的替換,不作正確性檢查,不關含義是否正確照樣帶入,只有在編譯已被展開的源程式時才會發現可能的錯誤並報錯。例如:
#define PI 3.1415926
程式中的:area=PI*r*r 會替換為3.1415926*r*r
如果你把#define語句中的數字9 寫成字母g 預處理也照樣帶入。

2)typedef是在編譯時處理的。它在自己的作用域內給一個已經存在的型別一個別名,但是You cannot use the typedef specifier inside a function definition。

3)typedef int * int_ptr;

#define int_ptr int *
作用都是用int_ptr代表 int * ,但是二者不同,正如前面所說 ,#define在預處理 時進行簡單的替換,而typedef不是簡單替換 ,而是採用如同定義變數的方法那樣來宣告一種型別。也就是說;

//refer to (xzgyb(老達摩))
#define int_ptr int *
int_ptr a, b; //相當於int * a, b; 只是簡單的巨集替換

typedef int* int_ptr;
int_ptr a, b; //a, b 都為指向int的指標,typedef為int* 引入了一個新的助記符

這也說明了為什麼下面觀點成立
//QunKangLi(維護成本與程式設計師的創造力的平方成正比)
typedef int * pint ;
#define PINT int *

那麼:
const pint p ;//p不可更改,但p指向的內容可更改
const PINT p ;//p可更改,但是p指向的內容不可更改。

pint是一種指標型別 const pint p 就是把指標給鎖住了 p不可更改
而const PINT p 是const int * p 鎖的是指標p所指的物件。

3)也許您已經注意到#define 不是語句 不要在行末加分號,否則 會連分號一塊置換。
而關於 上面pint 指標鎖定,p不可修改。 PINT 是鎖定指標p所指的物件。可以用下面的例子:

首先說一下const

const在宣告變數時,說明該變數的值在其生存週期裡是不可以改變的。

對一般的變數而言。const的位置不同表達的意思是一樣的,如:

int const a

const int a

這倆者是一樣的,憑你喜好來選擇。

但對於指標中卻不一樣,位置不同所表達的含義卻不一樣。如:

int const * pci; 

//指向(整形常量)的指標。指標(pci)可改變,指標指向的值(&pci)不能改變

int *const cpi

//指向整形的(常量指標)。指標(cpi)不能變,指標指向的值(&cpi)可以改變

int const * const cpci

//指向(整形常量)的(常量指標)。指標和指標指向的值都不能改變

#include <stdio.h>  
int main()  
{  
    int a = 1 ,b =2, c = 3;  
    int const *pci = &a;        //指向(整形常量)的指標。指標(pci)可改變,指標指向的值(&pci)不能改變  
    int *const cpi = &b; //指向整形的(常量指標)。指標(cpi)不能變,指標指向的值(&cpi)可以改變  
    int const * const cpci = &c;//指向(整形常量)的(常量指標)。二者都不能變  
  
    printf("原始賦值後(地址):pci=%5x  *cpi = %5x  *cpci = %5x\n",pci,cpi,cpci);  
    printf("原始賦值後(數值):*pci=%d  *cpi = %d  *cpci = %d\n",*pci,*cpi,*cpci);  
  
    pci = &b;   //正確。pci的指標可以改變   地址改變到了b
    //*pci = 8;   //出錯。pci的指標指向的變數的值不能改變  
  
    //cpi = &c;  //出錯。cpi的指標的不能改變  
    *cpi = 8;    //正確。cpi的指標指向的變數的值不能改變  這裡將b的值改成了8 
  
    //cpci = &a; //出錯。cpci的指標的不能改變  
    //*cpci = 8;   //出錯。cpci指標指向的變數的值不能改變  
    printf("改變賦值後(地址):pci=%5x  *cpi = %5x  *cpci = %5x\n",pci,cpi,cpci);  
    printf("改變賦值後(數值):*pci=%d  *cpi = %d  *cpci = %d\n",*pci,*cpi,*cpci);  
  
    return 0;  
      
}  

相關文章