c常量指针与指针常量情况分析

今天做了道指针题,问哪些定义可行,有点模糊,重新整理下,参考这个

“常量指针”所指向的地址上的数据是常量,而“指针常量”所指向的地址是常量,地址上面的数据是可以变化的

“常量指针”表述为常量的指针,它首先应该是一个指针,就是指向常量的指针,关键字 const出现在 * 左边,表示指针所指向地址的内容是不可修改的,但指针自身可变。

“指针常量”表述为指针的常量,它首先应该是一个常量,指针自身是一个常量,关键字 const出现在 * 右边,表示指针自身不可变,但其指向地址的内容是可以被修改的。(一开始初始化指向哪,就只能指向哪,不能指向其他的地方了,就像一个数组的数组名一样,是一个固定的指针,不能对它移动,)

举例说明:

如果 我们定义一个常量,const int a=7; 那么 我们可以定义一个常量指针来指向它,const int *p=&a, 或分成两步实现,const int *p; p=&a;

int a;   int *const p=&a;  或者 int a; int * const p;  p=&a;

1 void main(){
 2     char *str1={"Hello"};
 3     char *str2={"Hello World"};
 4     char * const ptr1 =str1 ;
 5     //指针常量--指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化
 6 
 7     ptr1 =str2; //错误 因为这是一个常量指针,改变指向的地址了
 8 
 9     printf("%s n",*ptr1);
10     }
11 
12 
13 // 编译错误    error C3892: 'ptr1' : you cannot assign to a variable that is const    
14 


第二个

 1 void main(){
 2     char *str1={"Hello"};
 3     char *str2={"Hello World"};
 4     char * const ptr1 =str1 ;
 5     //指针常量--指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化
 6 
 7     *ptr1 ='A';// 正确 因为指向的地址的内容是可以变化的
 8 
 9     printf("%c n",*ptr1);
10     }
11 
12 //输出  A
13 

第三个

 1 void main(){
 2     char *str1={"Hello"};
 3     char *str2={"Hello World"};
 4     const char *ptr1 = str1;
 5     //常量指针--指向字符串常量,所指向的字符串内容不能变,但是指向的地址可以变化
 6     
 7     ptr1=str2;// 正确 因为指向的地址是可以变化的
 8 
 9     printf("%s n",ptr1);
10     }
11 
12 //输出 Hello World

第四个

 1 void main(){
 2     char *str1={"Hello"};
 3     char *str2={"Hello World"};
 4     const char *ptr1 = str2;
 5     //常量指针--指向字符串常量,所指向的字符串内容不能变,但是指向的地址可以变化
 6     
 7     ptr1='A';// 错误 因为指向的地址是内容是不可以变化的
 8 
 9     printf("%c n",ptr1);
10     }
11 
12 
13 //编译错误    error C2440: '=' : cannot convert from 'char' to 'const char *'

可以这样来记忆: 
const int a;       // const常量 
const int *a; //指向常量的指针 
int *const a=&n; //常量指针 
你在纸上按顺序写下以上三行,记住它们的注释长度:短————短, 

          int*p;读作p为指针,指向int,所以p为指向int的指针;

         int*const p;读作p为常量,是指针,指向int,所以p为指向int的常量指针, p不可修改;

         int const *p;p为指针,指向常量,为int,所以p为指向int常量的指针, *p不可修改 ;

         int ** const p; p为常量,指向指针,指针指向int,所以p为指向int型指针的常量指针,p不可修改;

         int const**p; p为指针,指向指针,指针指向常量int,所以p为指针,指向一个指向int常量的指针, **p为int,不可修改 ;

         int * const *p ; p为指针,指向常量,该常量为指针,指向int,所以p为指针,指向一个常量指针,*p为指针,不可修改 ;

         int ** const *p; p为指针,指向常量,常量为指向指针的指针,p为指针,指向常量型指针的指针,*p为指向指针的指针,不可修改 ;

         int * const **p; p为指针,指向一个指针1,指针1指向一个常量,常量为指向int的指针,即p为指针,指向一个指向常量指针的指针, **p为指向一个int的指针,不可修改

          下面列举个例子,关于STL里面使用迭代器来模拟同样情况的话:

          std::vector<int> vec;

          const std::vector<int>::iterator iter=vec.begin();  //ietr just like a T* const

          *iter=10;   //ok,change the item pointed to

          ++iter;   //wrong,iter is const

           std::vector<int>::const_iterator cIter=vec.begin();   //iter acts like a const T*

           *cIter=10;   //wrong,*cIter is const

           ++cIter;   //OK

“常量指针”所指向的地址上的数据是常量,而“指针常量”所指向的地址是常量,地址上面的数据是可以变化的

“常量指针”表述为常量的指针,它首先应该是一个指针,就是指向常量的指针,关键字 const出现在 * 左边,表示指针所指向地址的内容是不可修改的,但指针自身可变。

“指针常量”表述为指针的常量,它首先应该是一个常量,指针自身是一个常量,关键字 const出现在 * 右边,表示指针自身不可变,但其指向地址的内容是可以被修改的。(一开始初始化指向哪,就只能指向哪,不能指向其他的地方了,就像一个数组的数组名一样,是一个固定的指针,不能对它移动,)

举例说明:

如果 我们定义一个常量,const int a=7; 那么 我们可以定义一个常量指针来指向它,const int *p=&a, 或分成两步实现,const int *p; p=&a;

int a;   int *const p=&a;  或者 int a; int * const p;  p=&a;

下面看几个简单的例子,可以说明他们的区别:
            第一个

1 void main(){
 2     char *str1={"Hello"};
 3     char *str2={"Hello World"};
 4     char * const ptr1 =str1 ;
 5     //指针常量--指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化
 6 
 7     ptr1 =str2; //错误 因为这是一个常量指针,改变指向的地址了
 8 
 9     printf("%s n",*ptr1);
10     }
11 
12 
13 // 编译错误    error C3892: 'ptr1' : you cannot assign to a variable that is const    
14 


第二个

 1 void main(){
 2     char *str1={"Hello"};
 3     char *str2={"Hello World"};
 4     char * const ptr1 =str1 ;
 5     //指针常量--指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化
 6 
 7     *ptr1 ='A';// 正确 因为指向的地址的内容是可以变化的
 8 
 9     printf("%c n",*ptr1);
10     }
11 
12 //输出  A
13 

第三个

 1 void main(){
 2     char *str1={"Hello"};
 3     char *str2={"Hello World"};
 4     const char *ptr1 = str1;
 5     //常量指针--指向字符串常量,所指向的字符串内容不能变,但是指向的地址可以变化
 6     
 7     ptr1=str2;// 正确 因为指向的地址是可以变化的
 8 
 9     printf("%s n",ptr1);
10     }
11 
12 //输出 Hello World

第四个

 1 void main(){
 2     char *str1={"Hello"};
 3     char *str2={"Hello World"};
 4     const char *ptr1 = str2;
 5     //常量指针--指向字符串常量,所指向的字符串内容不能变,但是指向的地址可以变化
 6     
 7     ptr1='A';// 错误 因为指向的地址是内容是不可以变化的
 8 
 9     printf("%c n",ptr1);
10     }
11 
12 
13 //编译错误    error C2440: '=' : cannot convert from 'char' to 'const char *'

可以这样来记忆: 
const int a;       // const常量 
const int *a; //指向常量的指针 
int *const a=&n; //常量指针 
你在纸上按顺序写下以上三行,记住它们的注释长度:短————短, 

发布了13 篇原创文章 · 获赞 0 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/jonathanxqs/article/details/45117833