• c++中的指针


    一、指针的基本概念

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

    • 内存编号是从0开始记录的,一般采用16进制数字表示。
    • 可以利用指针变量保存地址。

    二、指针变量的定义和使用

    指针变量定义语法: 数据类型  * 变量名

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. //1.定义一个指针
    6. int a = 10;
    7. //指针定义的语法: 数据类型 * 指针变量名 ;
    8. int* p;
    9. //让指针记录变量a的地址
    10. p = &a;
    11. cout << "a的地址是:" << &a << endl;
    12. cout << "指针p指向的地址是:" << p << endl;
    13. //2.如何使用指针
    14. //可以通过解引用的方式来找到指针指向的内存
    15. //指针恰加 * 代表解引用,找到指针指向的内存中的数据
    16. *p = 1000;//将指针指向的内存中的数据修改为1000
    17. cout << "a的值是:" << a << endl;
    18. cout << "指针p指向的地址中的值是:" << *p << endl;
    19. system("pause");
    20. return 0;
    21. }

    三、指针所占的内存空间

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

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. // 指针所占的内存空间
    6. int a = 10;
    7. //int* p;
    8. //p = &a;
    9. int* p = &a;
    10. //在32位操作系统下,指针是占用4个字节空间大小,不管是什么数据类型
    11. //在64位操作系统下,指针是占用8个字节空间大小,不管是什么数据类型
    12. cout<<"sizeof(int *)="<<sizeof(p)<
    13. cout << "sizeof(int *)=" << sizeof(int *) << endl;
    14. cout << "sizeof(int *)=" << sizeof(float *) << endl;
    15. cout << "sizeof(int *)=" << sizeof(double *) << endl;
    16. cout << "sizeof(int *)=" << sizeof(char *) << endl;
    17. system("pause");
    18. return 0;
    19. }

    四、空指针和野指针

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

    用途:初始化指针变量

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

    4.1 空指针

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. //空指针
    6. //1.空指针用于给指针变量进行初始化
    7. int* p = NULL;
    8. //2.空指针是不能进行访问的
    9. //0~255之间的内存编号是系统占用的,因此不可以访问
    10. *p=100; //error: dereferencing pointer to incomplete type 'int'
    11. system("pause");
    12. return 0;
    13. }

     4.2 野指针

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

    注意:空指针野指针都不是我们申请的空间,因此不需要访问。

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. //野指针
    6. //在程序中,尽量避免出现野指针
    7. int *p =(int*)0x1100;
    8. cout<<*p<//输出地址为0x1100处的值,此处为0,所以会出现野指针错误
    9. system("pause");
    10. return 0;
    11. }

     五、const修饰指针

    const修饰指针有三种情况:

    1. const修饰指针 ----常量指针
    2. const修饰常量 ---指针常量
    3. const即修饰指针,又修饰常量

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. //1.const修饰指针
    6. int a = 10;
    7. int b = 10;
    8. const int* p = &a; //指向常量的指针
    9. //*p = 20; //错误,不能修改常量指针指向的值
    10. p = &b; //正确,可以修改指针指向的值
    11. //2.const修饰常量
    12. int * const p2 = &a; //指针指向常量,不能修改指针指向的方向,指针指向的值可以改
    13. *p2 = 20; //正确,可以修改指针指向的值
    14. //p2 = &b; //错误,不能修改指针指向的方向
    15. //3.const修饰指针和常量
    16. //指针指向和指针指向的值都不能修改,只能读取
    17. const int * const p3=&a;
    18. //*p3 = 20; //错误,不能修改指针指向的值
    19. //p3 = &b; //错误,不能修改指针指向的方向
    20. system("pause");
    21. return 0;
    22. }

    六、指针和数组

    作用:利用指针访问数组中元素

    1. #include
    2. using namespace std;
    3. int main() {
    4. //指针和数组
    5. //利用指针访问数组中的元素
    6. int arr[10]= {1,2,3,4,5,6,7,8,9,10};
    7. cout<<"数组中的第一个元素:"<0]<
    8. int* p = arr;//arr就是数组的首地址
    9. cout<<"数组中的第一个元素的地址:"<<*p<
    10. p++;//指向数组的第二个元素
    11. cout<<"数组中的第二个元素的地址:"<<*p<
    12. p--;//指向数组的第一个元素
    13. cout << "利用指针遍历数组" << endl;
    14. for (int i = 0; i < 10; i++) {
    15. cout << *(p + i) << " ";
    16. }
    17. cout << endl;
    18. system("pause");
    19. return 0;
    20. }

    七、指针和函数

    作用:利用指针做函数参数,可以修改实参的值

    1. #include
    2. using namespace std;
    3. //实现两个数字进行交换
    4. void swap01(int a, int b) {
    5. int temp = a;
    6. a = b;
    7. b = temp;
    8. cout << "a=" << a << " b=" << b << endl;
    9. }
    10. void swap02(int* a, int* b) {
    11. int temp = *a;
    12. *a = *b;
    13. *b = temp;
    14. }
    15. int main() {
    16. //指针和函数
    17. //1.值传递
    18. int a = 10;
    19. int b = 20;
    20. swap01(a, b);
    21. cout << "a=" << a << " b=" << b << endl; //输出结果为 a=20 b=10
    22. //2.地址传递
    23. //实参的值会发生改变
    24. swap02(&a, &b);
    25. cout << "a=" << a << " b=" << b << endl; //输出结果为 a=20 b=10
    26. system("pause");
    27. return 0;
    28. }

    八、指针、数组、函数(案例)

    1. #include
    2. using namespace std;
    3. //冒泡排序函数
    4. void bubbleSort(int* arr, int len) {
    5. {
    6. for (int i = 0; i < len - 1; i++) {
    7. for (int j = 0; j < len - 1 - i; j++) {
    8. if (arr[j] > arr[j + 1]) {
    9. int temp = arr[j];
    10. arr[j] = arr[j + 1];
    11. arr[j + 1] = temp;
    12. }
    13. }
    14. }
    15. }
    16. }
    17. int main()
    18. {
    19. //1.先常见一个数组
    20. int arr[10] = { 4,3,6,9,1,2,10,8,7,5 };
    21. //2.创建函数,实现冒泡排序
    22. int len = sizeof(arr) / sizeof(arr[0]);
    23. //3.调用函数,对数组进行排序
    24. bubbleSort(arr, len);
    25. cout << "排序后的数组为:";
    26. for (int i = 0; i < len; i++) {
    27. cout << arr[i] << " ";
    28. }
    29. cout << endl;
    30. system("pause");
    31. return 0;
    32. }

  • 相关阅读:
    Qt-制作一个简单的计算器-实现四则运算-将结果以对话框的形式弹出来
    nacos鉴权报invalid username or password
    worthington酶丨worthington酶的化学性质简介
    ELK入门(一)-Elasticsearch(docker版)
    故障诊断模型 | Maltab实现RF随机森林的故障诊断
    JDK,JRE,JVM之间的关系
    将jar包打成docker镜像并推送到harbor上的标准步骤
    ios上传图片旋转90度的解决办法 - nextcloud
    程序员面试最反感的这件事,很多公司都会做
    小程序的性能优化
  • 原文地址:https://blog.csdn.net/m0_64703222/article/details/138175261