> 文章列表 > c++指针

c++指针

指针在C++中是一个非常强大的工具,它允许程序员直接访问和操作内存地址。这篇文章首先介绍了指针的基本概念,包括它们通过地址间接访问内存的能力,内存编号的十六进制表示,以及如何使用指针变量保存地址。接着,文章详细讨论了指针变量的定义和使用,包括指针和普通变量的区别,以及如何通过&操作符获取变量的地址,解引用指针以操作内存。

此外,文章还探讨了指针所占的内存空间大小,解释了在32位操作系统下,所有指针类型的大小都是4个字节。这为理解程序的内存占用和对齐优化提供了基础。紧接着,文章转向了空指针和野指针的概念,强调了它们都指向未分配或非法的内存空间,不应该被访问。

进一步,文章介绍了const修饰指针的三种情况:常量指针、指针常量和同时修饰指针和常量。这不仅扩展了指针的使用范围,也增加了程序的安全性和可维护性。

最后,文章讨论了指针和数组的关系,展示了指针如何用于动态访问和处理数组元素,这是实现动态数据结构和处理复杂数据关系的重要手段。通过这些内容,读者可以更深入地理解指针的实际应用和重要性。

c++指针

黑马程序员

7 指针

7.1 指针的基本概念

指针的作用: 可以通过指针间接访问内存

内存编号是从0开始记录的,一般用十六进制数字表示

可以利用指针变量保存地址

7.2 指针变量的定义和使用

指针变量定义语法: 数据类型 * 变量名;
指针变量和普通变量的区别:

  • 普通变量存放的是数据,指针变量存放的是地址
  • 指针变量可以通过" * "操作符,操作指针变量指向的内存空间,这个过程称为解引用

总结1: 我们可以通过 & 符号 获取变量的地址

总结2:利用指针可以记录地址

总结3:对指针变量解引用,可以操作指针指向的内存

7.3 指针所占内存空间

提问:指针也是种数据类型,那么这种数据类型占用多少内存空间?
示例:

int main() {int a = 10;int * p;p = &a; //指针指向数据a的地址cout << *p << endl; //* 解引用cout << sizeof(p) << endl;cout << sizeof(char *) << endl;cout << sizeof(float *) << endl;cout << sizeof(double *) << endl;system("pause");return 0;
}

总结:所有指针类型在32位操作系统下是4个字节

7.4 空指针和野指针

空指针:指针变量指向内存中编号为0的空间

用途:初始化指针变量

注意:空指针指向的内存是不可以访问的

示例1:空指针

int main() {//指针变量p指向内存地址编号为0的空间int * p = NULL;//访问空指针报错 //内存编号0 ~255为系统占用内存,不允许用户访问cout << *p << endl;system("pause");return 0;
}

野指针:指针变量指向非法的内存空间

示例2:野指针

int main() {//指针变量p指向内存地址编号为0x1100的空间int * p = (int *)0x1100;//访问野指针报错 cout << *p << endl;system("pause");return 0;
}

总结:空指针和野指针都不是我们申请的空间,因此不要访问。

7.5 const修饰指针

const修饰指针有三种情况

const修饰指针 — 常量指针 (常量的指针)
const修饰常量 — 指针常量 (地址是一个常量)
const即修饰指针,又修饰常量

示例:

int main() {int a = 10;int b = 10;//const修饰的是指针,指针指向可以改,指针指向的值不可以更改const int * p1 = &a; p1 = &b; //正确//*p1 = 100;  报错//const修饰的是常量,指针指向不可以改,指针指向的值可以更改int * const p2 = &a;//p2 = &b; //错误*p2 = 100; //正确//const既修饰指针又修饰常量const int * const p3 = &a;//p3 = &b; //错误//*p3 = 100; //错误system("pause");return 0;
}

技巧:看const右侧紧跟着的是指针还是常量, 是指针就是常量指针,是常量就是指针常量

7.6 指针和数组
作用: