• 【C++】详细讲解指针使用,带你玩转C++指针~



    大家好,我是卷心菜。本篇主要讲解C++指针的使用和注意细节。如果您看完文章有所收获,可以三连支持博主哦~,嘻嘻。


    一、前言

    🎁作者简介:在校大学生一枚,Java领域新星创作者,Java、Python正在学习中。

    🍂日常学习网站:牛客网,可以用来刷算法题、工作内推、面经复习、练习SQL等等,很不错的多功能网站。点击注册学习刷题吧!

    📕自我提醒:多学多练多思考,编程能力才能节节高!


    二、指针的基本概念

    • 首先讲讲指针的作用:可以通过指针间接地访问内存。
    • 我们可以利用指针变量来保存地址。

    三、指针的定义和使用

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

    代码举例:

    int main()
    {
        int a = 18;
        // 定义指针变量p
        int* p;
        // 把a的地址给变量p
        p = &a;
        cout << p << endl;
        cout << &a << endl;
        // 解引用
        cout << *p;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    运行结果:

    在这里插入图片描述

    指针变量和普通变量的区别:

    • 普通变量存放的是数据,指针变量存放的是地址。
    • 指针变量可以通过" * "操作符,操作指针变量指向的内存空间,这个过程称为解引用。

    总结:

    • 我们可以通过 & 符号 获取变量的地址。
    • 利用指针可以记录地址。
    • 对指针变量解引用,可以操作指针指向的内存数据。

    四、指针所占内存空间

    • 指针也是一种数据类型,那么这种数据类型占用多少内存空间呢?

    代码演示:

    int main()
    {
    	// 在64位系统演示下,输出结果都是8位
        cout << sizeof(int*) << endl;
        cout << sizeof(float*) << endl;
        cout << sizeof(double*) << endl;
        cout << sizeof(char*) << endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    注意:在32位系统下输出结果都是4位。


    五、空指针和野指针

    • 什么是空指针?空指针的指针变量指向内存中编号为0的空间,它的作用是用来初始化指针变量;空指针指向的内存是不可以访问的。

    代码演示:

    int main() {
    	//指针变量p指向内存地址编号为0的空间
    	int * p = NULL;
    	//访问空指针报错 
    	//内存编号0 ~255为系统占用内存,不允许用户访问
    	cout << *p << endl;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 什么是野指针?野指针就是指针变量指向非法的内存空间。

    代码演示:

    int main() {
    	//指针变量p指向内存地址编号为0x1100的空间
    	int * p = (int *)0x1100;
    	//访问野指针报错 
    	cout << *p << endl;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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


    六、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; //错误
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    七、指针和数组

    • 我们可以利用指针来快速的访问数组、遍历数组。

    代码演示:

    int main() {
        int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
        int* p = arr;
        cout << "数组的第一个元素:" << arr[0] << endl;
        cout << "指针数组的第一个元素:" << *p << endl;
        // 指针遍历数组
        for (int i = 0; i < sizeof(arr) / sizeof(int); i++) {
            cout << *p << " ";
            p++;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    运行结果:

    在这里插入图片描述

    八、指针和函数

    • 我们可以利用指针来交换值,改变值等操作。
    void swap1(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
    }
    void swap2(int* a, int* b) {
        int temp = *a;
        *a = *b;
        *b = temp;
    }
    int main()
    {
        int a = 10;
        int b = 20;
        swap1(a, b);
        //运行结果并没有交换
        cout << "a = " << a << " b = " << b << endl;
        swap2(&a, &b);
        //运行结果进行了交换
        cout << "a = " << a << " b = " << b << endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    运行结果:

    在这里插入图片描述


    感谢阅读,一起进步,嘻嘻~

  • 相关阅读:
    [Matlab有限元分析] 1.有限元分析的发展、基本概念和特点
    Linux开机默认进入命令行或图形化模式
    【git】超详细使用指令
    行程单识别易语言代码
    云计算基础知识
    day42
    后端的datetime类型数据转为string作为(vue)前端的时间YYYY-MM-DD HH:mm:ss
    React-editor-js not showing up in a function component
    Debezium系列之:Debezium采集Mysql数据库,数据库时间字段值的变化
    使用 Spring Security 实现安全认证的 Spring Boot 应用
  • 原文地址:https://blog.csdn.net/weixin_59654772/article/details/126067260