C語言有關指針的變量聲明中的幾個易錯點

C語言有關指針的變量聲明中的幾個易錯點

Technorati 標籤:  指針, typedef, const, define

         咱們都知道,至少據說過指針對於C語言中的重要意義,可是在使用指針時卻經常讓咱們痛不欲生,這裏有幾個在聲明指針有關的變量時易錯的地方。 數組

1. int* 和 int  * (注意空格的位置)

        對於單變量聲明,即一條語句中只聲明一個指針變量的狀況,沒有區別;緣由是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;

2.  typedef 和 #define 在建立類型別名時的區別

         在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是整數」); 編譯

3. 「常量指針」和」指向常量的指針」

        對於常量變量: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*/  
}
相關文章
相關標籤/搜索