c++指针
指针在C++中是一个非常强大的工具,它允许程序员直接访问和操作内存地址。这篇文章首先介绍了指针的基本概念,包括它们通过地址间接访问内存的能力,内存编号的十六进制表示,以及如何使用指针变量保存地址。接着,文章详细讨论了指针变量的定义和使用,包括指针和普通变量的区别,以及如何通过&操作符获取变量的地址,解引用指针以操作内存。
此外,文章还探讨了指针所占的内存空间大小,解释了在32位操作系统下,所有指针类型的大小都是4个字节。这为理解程序的内存占用和对齐优化提供了基础。紧接着,文章转向了空指针和野指针的概念,强调了它们都指向未分配或非法的内存空间,不应该被访问。
进一步,文章介绍了const修饰指针的三种情况:常量指针、指针常量和同时修饰指针和常量。这不仅扩展了指针的使用范围,也增加了程序的安全性和可维护性。
最后,文章讨论了指针和数组的关系,展示了指针如何用于动态访问和处理数组元素,这是实现动态数据结构和处理复杂数据关系的重要手段。通过这些内容,读者可以更深入地理解指针的实际应用和重要性。
黑马程序员
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 指针和数组
作用: