typedef和define具體的詳細區別
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; }
相關文章
- define和typedef的區別
- typedef與define的區別
- define與typedef區別與聯絡
- #define、const、typedef的差別
- #define巨集與列舉以及typedef關鍵字的區別
- #define 與 typedef
- define和defined區別
- 淺談typedef與define
- const、define 和 static 的區別
- HashMap和Hashtable的詳細區別HashMap
- C語言中const和#define的區別C語言
- DeFi和CeFi的區別詳細講解
- PHP 定義常量 define 和 const的區別PHP
- php中const和define有什麼區別PHP
- 談談redis,memcache的區別和具體應用場景Redis
- EXT2和EXT3的詳細區別(轉)
- Go 語言 := 的具體使用與區別Go
- 小米盒子3和增強版的區別?詳細對比
- define巨集定義和const常量定義之間的區別
- 模板顯式、隱式例項化和(偏)特化、具體化的詳細分析
- Flask框架和Django框架有什麼區別?詳細分析!Flask框架Django
- 詳細講解刪除SQL Server日誌的具體方法SQLServer
- 結構體定義 typedef struct 用法詳解和用法小結結構體Struct
- @OneToOne、@ManyToOne的具體使用與區別
- CreateThread()與beginthread()的區別詳細解析thread
- 概要設計與詳細設計的區別
- c# 中的靜態類(satic class)和具體類的區別及用法C#
- JavaScript中的new map()和new set()使用詳細(new map()和new set()的區別)JavaScript
- 雲平臺和雲管平臺的三大區別詳細解析
- Proc中使用char陣列、VARCHAR陣列和char變數進行DELETE操作具體行數的細微區別陣列變數delete
- MyBatis中#{}和${}的區別詳解MyBatis
- cookie 和session 的區別詳解CookieSession
- Redis 和 Memcached 的區別詳解Redis
- Cookie和Session的區別詳解CookieSession
- 細說紛紜——Redis 和 Memcached 的區別Redis
- sqlplus中define定義的常量和variable定義的變數的區別!SQL變數
- 軟體和程式的區別
- [PHP]常量定義: const和define區別和運用; 附constant解釋PHP