咱們都知道,至少據說過指針對於C語言中的重要意義,可是在使用指針時卻經常讓咱們痛不欲生,這裏有幾個在聲明指針有關的變量時易錯的地方。 數組
對於單變量聲明,即一條語句中只聲明一個指針變量的狀況,沒有區別;緣由是C語言容許形式的自由性。即如下兩種聲明方式效果相同。 函數
int *a; int* a;
對於一條語句中聲明多個指針變量的狀況,有很大區別。 spa
int* a, b,c;
對於這條語句,常會形成咱們的誤解:認爲聲明瞭三個整型指針。可是正解是:只有a是整型指針,b和c都是普通的整數。
這裏的星號「*」號只是聲明變量a的一部分,以上的變量聲明至關於: 指針
int *a; int b; int c;
若是但願在一條語句中聲明多個整型指針,正確的方式應該是: code
int *a, *b, *c;
在C語言中實現建立類型別名的方法有兩種:一種是使用typedef;一種是使用#define。使用方法也相似。 ci
typedef int NEW_INT_TYPE1; /*int在前*/ NEW_INT_TYPE1 a1 = 1; #define NEW_INT_TYPE2 int /*int在後*/ NEW_INT_TYPE2 a2 = 2; printf("%d /n",a1); printf("%d /n",a2);
可是若是須要建立新類型名時,咱們只應該使用typedef,而不是#define。由於#define僅僅是在編譯的時候作簡單的替換工做,因此在處理一些問題上會有缺陷。 get
int m=2; typedef int* NEW_INT_TYPE3; /*int在前*/ NEW_INT_TYPE3 a3, a4; a3 = &m; /*指針賦值*/ a4 = &m; /*指針賦值*/ #define NEW_INT_TYPE4 int* /*int在後*/ NEW_INT_TYPE4 a5, a6=6; a5 = &m; /*指針賦值*/ printf("%d /n",*a3); printf("%d /n",*a4); printf("%d /n",*a5); printf("%d /n",a6); /*運行結果: 2 2 2 6*/
分析:a3和a4是整型指針,a5是整型指針,可是a6只是整型(只要記住#define 僅僅是作替換操做,將NEW_INT_TYPE4替換爲int*,而int* a5, a6; 的結果是「a5是整型指針,a6是整數」); 編譯
對於常量變量:int const a 和const int a 效果相同;都是聲明一個整型的變量a,且a是常量,其值不能改變(因爲其值不能改變,其賦值方式只有兩種:一種是聲明時初始化,如int const a=1; 一種是其做爲函數的形式參數,函數被調用時用實參來初始化)。 table
對於含有指針時,根據聲明時const和星號"*" 的位置,有三種形式: class
形式 |
名稱 |
說明 |
分析方法 |
int const *p | 指向常量的指針 | 能修改指針自己的值,可是不能修改其指向的值 | 從變量標識符開始(即從右向左),①*p指向一個整數;②const修飾」*p」,表示*p是一個常量,即p指向的值是一個常量。因此,不能夠修改」*p」,即不可修改p指向的值。 |
const int *p | 指向常量的指針 | 同上 | 同上 |
int * const p | 指針常量 | 能修改其指向的整型的值,可是不能修改指針自己的值 | 從變量標識符開始(即從右向左),const修飾p,表示p是常量,即不能修改p自己,但p指向的值能夠修改。 |
總結,區分這兩種類型的順序是:從右向左看,一步一步的肯定。
衍生的更爲特殊的指針:指向常量的常量指針,聲明方式是 int const * const p; 對於它,「指針自己的值」和「指向的值」都不能修改。
注意:有常量聲明的變量只有兩種賦值方式;一種是在聲明時直接賦值,如int m; int * const p = &m; 另外一種方法針對在函數中聲明的形式參數,在函數被調用時被賦值,例如:當是不須要修改數組的元素時,形式參數使用int const a[],即a指向的內容不能修改。
void firstTest(){ int m = 2; int * const p = &m;/*指針p 是常量指針,要在聲明時賦值*/ /*不能寫爲 int * const p; p = &m;*/ printf("%d /n",*p); *p = 5; /*能夠改變指針p 指向的值*/ printf("%d /n",*p); getchar(); p=&m; /*編譯報錯,由於不能改變指針p自己 的值,*/ } void secondTest(){ int m = 2; int n = 3; int const *p; /*指向常量的指針*/ p = &m; /*也能夠寫爲 int const *p = &m; */ printf("%d /n",*p); p = &n; /*能夠改變指針p自己的值*/ printf("%d /n", *p); *p = 3;/* 編譯報錯,不能修改它指向的值。雖然這裏*p的值原本就是2*/ }