• 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. }

  • 相关阅读:
    第十四章大数据和数据科学4分
    用Unity同时开发【微信小游戏】【安卓】【IOS】游戏#5.5.1 窗口管理器
    前端综合面试题(持续更新)
    基于遗传算法的微电网调度(风、光、蓄电池、微型燃气轮机)(Matlab代码实现)
    Flutter教程之为什么 Flutter 是创业的最佳选择?
    Matlab导入log(或txt)文件,提取数据或其他信息
    专业的人做专业的事 GBASE参编数据库发展研究报告(2022年)、入选全球数据库产业图谱
    分布式系统中的领导选举
    Adobe Acrobat Pro DC 2023:提升工作效率,激发创意灵感 mac/win版
    性能测试性能瓶颈问题分析调优案例
  • 原文地址:https://blog.csdn.net/m0_64703222/article/details/138175261