C++之指针与常量


该文为中国大学MOOC上北京邮电大学崔毅东和杨谈老师主讲的《C++程序设计(面向对象进阶)》笔记整理

1. const

常量是程序中一块数据,这个数据一旦声明后就不能被修改

代码示例:

const datatype CONSTANTNAME = VALUE;
或
datatype const CONSTANTNAME = VALUE;

常量分为命名常量和字面常量,如 const int A = 12; 其中 A 是这块数据的名字,称为命名常量,其中 12 能从字面上就看出它的值,称为字面常量

2. 指针

指针是一个地址,类似 0x8FFF 这样。而地址,就是某个内存位置的编号。该位置的地址可以存放数据,这些数据被称为"指针所指的数据"或"指针指向的数据"

代码示例:

int* x;  // 定义 int 型指针
int y = 2; 
x = &y;  // &y 取到 y 的地址,赋值给 x
std::cout << *x << std::endl;  // *x 访问指针指向数据的值

3. 常量和指针

指针本身具有两个属性:

  • 指针本身
  • 指针所指向的数据

指针所指向的数据可以是常量,也可以是变量;指针可以是常量,也可以是变量,即:

  • 当指针所指向的数据为变量,指针也是变量时,称为"指针变量"

    int x = 5;
    int* y = &x;
    int z = 3;
    *y = 20;  // *y 可以改变 x 的值
    y = &z; // y 也可以指向其他地址
    
  • 当指针所指向的数据为常量,指针是变量时,称为"常指针"

    const int x = 5;
    const int* y = &x;  // const 意思是此指针指向的数据为常量
    int z = 10;
    *y = 20;   // error,因为指针指向的数据为常量
    y = &z;   // y 可以指向其他地址
    
  • 当指针所指向的数据为变量,指针是常量时,称为"指针常量"

    int x = 5;
    int* const y = &x; 
    int z = 10;
    *y = 20;   // *y 可以改变 x 的值
    y = &z;   // error,y 为常量,不可以指向其他值
    
  • 当指针所指向的数据为常量,指针是常量时,称为"常指针常量"

    const int x = 5;
    // 前一个 const 指明此指针指向的数据为常量,后一个 const 指明此指针为常量
    const int* const y = &x;
    int z = 10;
    *y = 20;  // error,*y 指向的 x 为常量
    y = &z;   // error,y 为常量
    

4. 指针的内存布局

代码:

const int a = 5;
int b = 9;
const int* pa = &a;
int* const pb = &b;

指针的内存布局:

在这里插入图片描述

5. 总结

  • *(指针)和 const(常量)谁在前先读谁
  • * 代表被指的数据,名字代表指针地址
  • const 在谁前面就不允许谁改变,例如 const int * x; const 在 * 前面,即指针指向的数不能被修改;而 int * const y; const 在 y 前面,即指针的指向不能被修改
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章