C++指针

本文详细介绍了指针在C++中的基本概念,包括指针的作用、定义和使用,以及指针所占内存空间的大小。讨论了空指针和野指针的区别,强调了它们的安全性问题。接着,讲解了const如何修饰指针,展示了不同修饰方式下的行为。此外,还探讨了指针在操作数组和函数参数传递时的角色,演示了如何通过指针访问数组元素和实现函数间的值交换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、指针的基本概念

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

三、指针所占内存空间

四、空指针和野指针

五、const修饰指针

六、指针和数组

七、指针和函数


一、指针的基本概念

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

  • 内存百年好是从0开始记录的,一般使用十六进制数字表示
  • 可以利用指针变量保存地址

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

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

示例:

#include<iostream>

#include<cmath>

using namespace std;

int main()

{

    // 定义指针

    int a=10;

    int *p=NULL;

    // 让指针记录变量a的地址

    p=&a;

    cout<<"a的地址为:"<<&a<<endl;

    cout<<"指针p记录的a的地址为:"<<p<<endl;

    cout<<"指针p指向的内容为:"<<*p<<endl;

    return 0;

}

运行结果:

三、指针所占内存空间

在32位操作系统下,占用4个字节空间,64位下占用8个字节。

示例:

#include<iostream>

#include<cmath>

using namespace std;

int main()

{

    // 定义指针

    int a=10;

    int *p=NULL;

    // 让指针记录变量a的地址

    p=&a;

    // 在32位操作系统下,指针是占4个字节空间大小,不管是什么数据类型

    // 在64位操作系统下,指针是占8个空间大小

    cout<<"指针类型的数据占用的空间大小为:"<<sizeof(int *)<<endl;

    cout<<"指针类型的数据占用的空间大小为:"<<sizeof(float *)<<endl;

    cout<<"指针类型的数据占用的空间大小为:"<<sizeof(double *)<<endl;

    cout<<"指针类型的数据占用的空间大小为:"<<sizeof(char *)<<endl;

    return 0;

}

运行结果:

四、空指针和野指针

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

用途:初始化指针变量

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

示例:

#include<iostream>

#include<cmath>

using namespace std;

int main()

{

    // 空指针

    // 1、空指针用于给指针变量进行初始化

    int *p=NULL;

    // 2、空指针是不可以进行访问的

    // 0~255之间的内存编号是系统占用的,因此不可以访问



    // 访问空指针报错
    
    cout<<*p<<endl;

    return 0;

}

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

示例:

#include<iostream>

#include<cmath>

using namespace std;

int main()

{

    // 野指针

    // 在程序中,尽量避免出现野指针

    int *p=(int *)0x1100;

    cout<<*p<<endl;

    return 0;

}

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

五、const修饰指针

const修饰指针有三种情况:

  1. const修饰指针  ---常量指针( const int  *p = &a):指针的指向可以修改,但是指针指向的值不可以修改
  2. const修饰常量  --- 指针常量(int * const p = &a):指针的指向不可以修改,但是指针指向的值可以修改
  3. const既修饰指针,又修饰常量( const int  * const p = &a):指针的指向不可以修改,并且指针指向的值也不可以修改

示例:

#include<iostream>

#include<cmath>

using namespace std;

int main()

{

    // 1、const 修饰常量

    int a=10;

    int b=10;



    // const修饰的是指针,指针指向可以改,指针指向的值不可以更改
    
    const int *p1=&a;

    p1=&b; // 正确

    // *p =20 错误



    // 2、const修饰常量

    // 指针的指向不可以更改,指针指向的值可以改

    int * const p2=&a;

    *p2=100;// 正确

    // p2=&b // 错误,指针的指向不可以修改



    // 3、const修饰指针和常量

    // 指针的指向和指针指向的值都不可以更改

    const int * const p3=&a;

    // *p3=10;  // 错误

    // p3=&b;  // 错误
    
    return 0;

}

六、指针和数组

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

示例:

#include<iostream>

#include<cmath>

using namespace std;

int main()

{

    // 指针和数组

    // 利用指针访问数组中的元素



    int arr[10]={1,2,3,4,5,6,7,8,9,10};

    cout<<"遍历这个数组"<<endl;

    for(int i=0;i<10;i++){

        cout<<arr[i]<<" ";

    }

    cout<<endl;

    cout<<"第一个元素为:"<<arr[0]<<endl;



    int *p=arr; // arr就是数组的首地址

    cout<<"利用指针访问第一个元素:"<<*p<<endl;

    p++; //让指针向后偏移4个字节,因为p是int类型的

    cout<<"利用指针访问第二个元素:"<<*p<<endl;



    // 利用指针遍历数组中的元素
    int *p2=arr;

    cout<<"利用指针遍历数组中的元素"<<endl;

    for(int i=0;i<10;i++){

        cout<<*p2<<" ";

        p2++;

    }

    cout<<endl;

    return 0;

}

运行结果:

七、指针和函数

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

示例:

#include<iostream>

#include<cmath>

using namespace std;

// 实现两个数字交换(值传递)

void swap01(int a,int b)

{

    int temp=a;

    a=b;

    b=temp;

    cout<<"swap01 a="<<a<<endl;

    cout<<"swap01 b="<<b<<endl;

}

// 实现两个数字交换(地址传递)

void swap02(int *p1,int *p2)

{

    int temp=*p1;

    *p1=*p2;

    *p2=temp;

    cout<<"swap02 a="<<*p1<<endl;

    cout<<"swap02 b="<<*p2<<endl;

}

int main()

{

    // 指针和函数

    // 1、值传递

    int a=10;

    int b=20;

    swap01(a,b);

    cout<<"a="<<a<<endl;

    cout<<"b="<<b<<endl;

    // 2、地址传递

    swap02(&a,&b);

    cout<<"a="<<a<<endl;

    cout<<"b="<<b<<endl;

    return 0;

}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值