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*/  
}
相关文章
相关标签/搜索