C++黑马程序员——P56-62. 指针
- P56. 指针——指针的定义和使用
- P57. 指针——指针所占内存空间
- P58. 指针——空指针
- P59. 指针——野指针
- P60. 指针——const修饰指针
- P61. 指针——指针和数组
- P62. 指针——指针和函数
- P56. 指针的定义和使用
指针的作用:可以通过指针间接访问内存
指针定义语法:
数据类型 * 指针变量名;
1 int main()
2 {
3 int a = 10;
4 //定义指针
5 int* p;
6 //让指针记录变量a的地址
7 p = &a;
8 cout << "a的地址为:" << &a << endl;
9 cout << "p为:" << p << endl;
10 //使用指针
11 //可以通过解引用的方式来找到指针指向的内存
12 //指针前加 * 代表解引用,找到指针指向的内存中的数据
13 *p = 1000;
14 cout << "a = " << a << endl;
15 cout << "*p = " << *p << endl;
16 return 0;
17 }
运行结果:
- P57. 指针所占内存空间
- int a = 10;
int * p;
p = &a;
等价于
int * p = &a;
- 在32位操作系统下,任何类型的指针都占4个字节大小;在64位操作系统下,指针占8个字节大小。
- P58. 空指针
空指针:指针变量指向内存中编号为0的空间
用途:初始化指针变量(指针一开始不知道指向哪好,那就指向这)
注意:空指针指向的内存是不可以访问的
int * p = NULL;
- P59. 野指针
野指针:指针变量指向非法的内存空间
总结:空指针和野指针都不是我们申请的空间,因此不要访问。
- P60. const修饰指针
- const修饰指针有三种情况:
1. const修饰指针——常量指针
const int * p = &a;
特点:指针的指向可以修改,但是指针指向的值不可以改。
* p = 20; //错误
p = &b; //正确
2. const修饰常量——指针常量
int * const p = &a;
特点:指针的指向不可以改,指针指向的值可以改。
* p = 20; //正确
p = &b; //错误
3. const既修饰指针,又修饰常量
const int * const p = &a;
特点:指针的指向和指针指向的值都不可以改。
* p = 20; //错误
p = &b; //错误
- P61. 指针和数组
1 int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
2 int* p = arr; //arr就是数组的首地址
3 cout << "*p = " << *p << endl; //数组第 1 个元素的值
4 cout << "p = " << (int)p << endl;
5 p++;
6 //弹幕:在C++中,当给一个指针添加一个值的时候,实际上添加的值是把这个值乘以指针引用的数据类型的大小。
7 cout << "p = " << (int)p << endl; //运行之后可以看到"p++"实际p+4
8 cout << "*p = " << *p << endl; //数组第 2 个元素的值
9 p = p + 2;
10 cout << "p = " << (int)p << endl;
11 cout << "*p = " << *p << endl; //数组第 4 个元素的值
运行结果:
- P62. 指针和函数
作用:利用指针作函数参数,可以修改实参的值
1 //值传递
2 void swap01(int a, int b)
3 {
4 int temp = a;
5 a = b;
6 b = temp;
7 cout << "swap01 a = " << a << endl;
8 cout << "swap01 b = " << b << endl;
9 }
10 //地址传递
11 void swap02(int* p1, int* p2)
12 {
13 int temp = *p1;
14 *p1 = *p2;
15 *p2 = temp;
16 cout << "swap02 *p1 = " << *p1 << endl;
17 cout << "swap02 *p2 = " << *p2 << endl;
18 }
19
20 int main()
21 {
22 int a = 10;
23 int b = 20;
24 //值传递不会改变实参
25 swap01(a, b);
26 cout << "a = " << a << endl;
27 cout << "b = " << b << endl;
28 //地址传递会改变实参
29 swap02(&a, &b);
30 cout << "a = " << a << endl;
31 cout << "b = " << b << endl;
32 return 0;
33 }
运行结果:
(〃>_<;〃)(〃>_<;〃)(〃>_<;〃)