C++黑马程序员——P56-62. 指针

发布时间 2023-03-28 17:08:53作者: 我会变强的
  • 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 }

运行结果:

  

(〃>_<;〃)(〃>_<;〃)(〃>_<;〃)