指针和引用(2)指针常量与常量指针

1.知识点

1.1指针常量——指针类型的常量

(1)指针常量本质是常量,指针用来说明常量的类型,表示该常量是一个指针类型的常量。

(2)在指针常量中,指针的值不可变,即始终指向同一个地址。

(3)但指针所指向的地址的值是可以通过*p来改变的。

用法如下:

1 //技巧:
2 //(1)读法:从左到右读,前面的是修饰词,后面的是主语
3 //如先出现指针(*),后出现常量(const),所以是指针常量
4 //(2)哪个东西不可变:直接看const后边是什么就什么不可变
5 //const后边是指针(p),所以是指针本身的值不可变。
6 int a = 10, b = 20;
7 int * const p = &a;
8 *p = 30;

1.2常量指针——指向常量的指针

(1)常量指针本质上是一个指针,常量表示指针指向的内容,说明指针指向的是一个“常量”。

(2)在常量指针中,指针指向的内容是不可变的,不可以通过*p来改变,但变量(指针指向的地址)可以通过自身赋值改变。

(3)另指针指向的地址是可以变的,即指向其他地址。

用法如下:

1 //技巧:
2 //(1)读法:从左到右读,前面的是修饰词,后面的是主语
3 //如下先出现常量(const),然后出现指针(*),所以是常量指针
4 //(2)哪个东西不可变:直接看const后边是什么就什么不可变
5 //如下const后面是*p,所以是指针指向的地址的值不可变(只限定了不可以通过*p来改变)
6 int a = 10, b = 20;
7 int const *p = &a;//不可以通过*p改变a的值
8 p = &b;//指针的地址是可以变的
9 a = 30;//也可以通过变量本身改变值

1.3const int 与int consts是等价的

const int *p==int const *p

2.面试题

2.1指针常量和常量指针的常见错误

 1 int main(int argc, char *argv[]) {
 2     int m = 10;
 3     const int n = 20;
 4
 5     const int *ptr1 = &m;
 6     int * const ptr2 = &m;
 7
 8     ptr1 = &n;
 9     ptr2 = &n;
10
11     *ptr1 = 3;
12     *ptr2 = 4;
13
14     int *ptr3 = &n;
15     const int *ptr4 = &n;
16
17     int *const ptr5;
18     ptr5 = &m;
19
20     const int * const ptr6 = &m;
21     *ptr6 = 5;
22     ptr6 = &n;
23
24     getchar();
25     return 0;
26 }

答案解析:

 1 int main(int argc, char *argv[]) {
 2     int m = 10;    //正确,变量
 3     const int n = 20;    //正确,常量
 4
 5     const int *ptr1 = &m;    //正确,常量指针,指向的地址的内容不可变
 6     int * const ptr2 = &m;    //正确,指针常量,指针指向不可变,是常量所以必须赋初值
 7
 8     ptr1 = &n;//正确
 9     ptr2 = &n;//错误,指针常量,指针的指向不可变
10
11     *ptr1 = 3;//错误,常量指针,指针指向的地址的内容不可变
12     *ptr2 = 4;//正确
13
14     int *ptr3 = &n;//错误,不能将常量的地址赋值给普通指针,常量地址只能赋值给常量指针
15     const int *ptr4 = &n;//正确
16
17     int *const ptr5;//错误,指针常量是常量,所有常量在定义时都必须赋初值
18     ptr5 = &m;//错误,应该定义时直接赋初值
19
20     const int * const ptr6 = &m;//正确,同时包含指针常量和常量指针的性质
21     *ptr6 = 5;//错误,不符合常量指针的性质
22     ptr6 = &n;//错误,不符合指针常量的性质
23     getchar();
24     return 0;
25 }

2.2指针常量用作函数参数

写出程序的输出结果,并说明在函数exchange2中将参数声明为const的意义,是否可以将const修饰符放在*之前。

 1 void exchange1(int a, int b) {
 2     int temp = a;
 3     a = b;
 4     b = temp;
 5 }
 6 void exchange2(int * const a, int * const b) {
 7     int temp = *a;
 8     *a = *b;
 9     *b = temp;
10 }
11 int main(int argc, char *argv[]) {
12     int m = 10, n = 20;
13     exchange1(m, n);
14     cout << "m=" << m << ";n=" << n << endl;  //输出:m=10;n=20
15     exchange2(&m, &n);
16     cout << "m=" << m << ";n=" << n << endl;  //输出:m=20,n=10
17     getchar();
18     return 0;
19 }

答案:第一行输出的是:m=10,n=20;第二行输出是:m=20,n=10.

解析:exchange1按值传递,函数中a,b值交换与m,n无任何联系,故无法改变m,n的值;exchange2中传入m,n的地址,通过解引用可以在函数内部改变m,n的值。在函数exhange2的参数中,const的作用是将指针声明为指针常量,防止指针a和b在使用过程中意外发生改变(改变将会报错)。如果将const放在*之前,指针a和b变成常量指针,无法修改指针指向的内容,从而无法实现交换m和n的目的。

2.3指针常量和字符串常量的冲突

请写出下面程序的运行结果:

1 int main(){
2   char *const str="apple";
3   *str="orange";
4   cout<<str<<endl;
5   getchar();
6   return 0;
7 }

答案1(其实有问题,看下面说明,):

 int main(){
   char *const str="apple"; //错误,为了修改str的值应该去掉const
   *str="orange";//错误,根据字符串赋值规则应该改为str="orange"
   cout<<str<<endl;
   getchar();
   return 0;
 }

说明:(1)一个字符串返回的是首字母的地址,故*str的值为‘a‘.

(2)字符串常量是存储在常量区,而常量的值不可以修改,所以在VC编译器中下面的语句是编译不过去的

char *str = "apple";

最正确的语句应该是(因为字符串常量本身是常量,不应该赋值给一个普通指针,这意味着通过指针可以改变常量的值,前后矛盾,上面语句在一些地方能通过编译,其实是由于历史遗留问题):

const char *str = "apple";

(3)字符串正确赋值给变量应该是给str,因为字符串返回的其实是字符串的首地址,所以应该赋值给指针str,而不是*str,该指针指向首地址。

综上最正确的答案应该如下:

1  int main(){
2    const char *str = "apple";//常量指针,指向的内容不可变
3    str = "oragne";//指针的指向是可变的
4    cout<<str<<endl;
5    getchar();
6    return 0;
7  }

原文地址:https://www.cnblogs.com/ys99/p/9194936.html

时间: 2024-11-09 03:01:56

指针和引用(2)指针常量与常量指针的相关文章

指针的指针,指针的引用(不是二维指针)

详解c++指针的指针和指针的引用 展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它.(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递. 如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来 的值.我们用下边的代码说明一下问题: int m_value = 1; void func(int *p) {

C++ 指针与引用 知识点 小结

[摘要] 指针可以指向变量.数组.字符串.函数.甚至结构体.即指针可以指向不同数据对象.指针问题 包括 常量指针.数组指针.函数指针.this指针.指针传值.指向指针的指针 等.主要知识点包括:1.指针与引用在概念上的三个区别及其在const.sizeof.自增运算上的差异:2.熟记经典swap函数的指针实现与引用实现,并能反映输出错误的两个函数的思想弊端:3.熟记GetMem函数的错误形式以及错误产生的原因:4.比较数组.指针与静态变量作为函数返回值的差异:5.str.*str以及&str三者

详解c++指针的指针和指针的引用

展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它.(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递. 如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来 的值.我们用下边的代码说明一下问题: int m_value = 1; void func(int *p) { p = &m_value; } i

C++ 中指针与引用的区别

指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过void*指针操作对象必须进行类型转化.     ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址: 引用是某块内存的别名.     ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指针需要解引用: 3. 引用只能在定义时被初始化

C/C++:提升_指针的指针和指针的引用

C/C++:提升_指针的指针和指针的引用 ◇写在前面 今天在使用指针的时候我发现了一个自己的错误. 我刚开自以为是觉得输出的两个P都是6,当时觉得两个p所指的地址相同,要修改就都修改了. 这是一个很低级的错误,两个p所指的地址相同,但是这两个指针的地址是不一样的. 好比两个人都知道火车站怎么走,但不能说这两个人是一个人,更何况在修改中一个人已经忘了火车站,它只知道高铁站怎么走,那另一个只知道火车站的并没有受到影响,他还是只知道火车站. 好了,那么如何做到main修改里面的p呢?要用到两种技术:

无效的指针、引用和迭代器

首先以示例代码为例: vector<int> v; //添加一些元素 fir(int i=0; i<10; ++i) v.push_back(i); int* my_favorite_element_ptr = &v[3]; cout<<"My favorite element = "<<(*my_favorite_element_ptr)<<endl; cout<<"Its address = &qu

指针和引用的区别(c/c++)

http://blog.csdn.net/thisispan/article/details/7456169 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名.  ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指针需要解引用: 3. 引用只能在定义时被初始化一次,之后不可变:指针可变: 引用"从一而终" ^_^ 4. 引用没有 const,指针有 const,const 的指针不可变: 5.

【转】指针和引用的区别

c++中的引用与指针的区别 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名. ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指针需要解引用: 3. 引用只能在定义时被初始化一次,之后不可变:指针可变: 引用“从一而终” ^_^ 4. 引用没有 const,指针有 const,const 的指针不可变: 5. 引用不能为空,指针可以为空: 6. “sizeof 引用”得到的是所指向的变量(对象)的大小

C++指针和引用

 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名.  ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指针需要解引用: 3. 引用只能在定义时被初始化一次,之后不可变:指针可变: 引用“从一而终” ^_^ 4. 引用没有 const,指针有 const,const 的指针不可变: 5. 引用不能为空,指针可以为空: 6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针

More Effective C++----(1)指针与引用的区别 &amp; (2)尽量使用C++风格的类型转换 &amp; (3)不要对数组使用多态

Item M1:指针与引用的区别 指针与引用看上去完全不同(指针用操作符"*"和"->",引用使用操作符". "),但是它们似乎有相同的功能.指针与引用都是让你间接引用其他对象.你如何决定在什么时候使用指针,在什么时候使用引用呢? 首先,要认识到在任何情况下都不能使用指向空值的引用.一个引用必须总是指向某些对象.因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空