今天做了道指针题,问哪些定义可行,有点模糊,重新整理下,参考这个
“常量指针”所指向的地址上的数据是常量,而“指针常量”所指向的地址是常量,地址上面的数据是可以变化的
“常量指针”表述为常量的指针,它首先应该是一个指针,就是指向常量的指针,关键字 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; //常量指针
你在纸上按顺序写下以上三行,记住它们的注释长度:短——长——短,