C++ 指针详解

C++ 指针

第二章 C++指针


1.指针的概念

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

  • 内存编号是从0开始记录的,一般用十六进制数字表示

  • 可以利用指针变量保存地址

2.指针变量的定义和使用

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

  • 普通变量存放的是数据,指针变量存放的是地址
  • 指针变量可以通过" * "操作符,操作指针变量指向的内存空间,这个过程称为解引用
void definitionPointer(){
    int a=10;
    int *p;
    //指针指向变量a的地址
    p=&a;
    cout<<p<<endl;
    cout<<&a<<endl;
     /**
     * 通过*操作指针变量指向的内存
     * 也就是*p是a的值
     */
    cout<<"*P="<<*p<<endl;
}

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

3.指针所占内存空间

void spacePointer(){
    cout<< sizeof(char *)<<endl;
    cout<< sizeof(string *)<<endl;
    cout<< sizeof(float *)<<endl;
    cout<< sizeof(int *)<<endl;
}

小结:指针在32位操作系统下是4字节;在64位系统下是8字节。

4.空指针和野指针

空指针:指针变量指向内存中编号为0的空间,空指针指向的内存是不可以访问的。
野指针:指针变量指向非法的内存空间

//debug运行
void errorPointer(){
    //指针变量p指向内存地址编号为0的空间
    int *p=NULL;
    //访问空指针报错
    *p=100;
    //内存编号0 ~255为系统占用内存,不允许用户访问
    cout<<"*P="<<*p<<endl;
    
    //指针变量p指向内存地址编号为0x1100的空间
    int * q = (int *)0x1100;
    //访问野指针报错
    cout << *q << endl;
}

5.指针、数组、函数

利用指针遍历数组

void arrayPointer(){
    int arr[]={1,2,3,4,5,6};
    int *p=arr;//p指向arr数组的首地址
    if(*p==arr[0]){
        cout << "hello world!" << endl;
    }
    for (int i = 0; i < ARRAY_SIZE(arr); i++)
    {
        //利用指针遍历数组
        cout << *p << endl;
        p++;
    }
}

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

void swapPinter(int *a,int *b){
    int temp=*a;
    *a=*b;
    *b=temp;
    cout << "a="<<*a << endl;
    cout << "b="<<*b << endl;
}

6.指针函数和函数指针

指针函数: 本质上是一个函数,返回值为指针。

//定义
 类型 *指针变量名(参数列表);
 exp:
	int *func(int &a){
	    a=1000;
	    return (int *)&a;
	}
	int main(){
    int i=10;
    int *a=func(i);//用一个指针变量接收func函数的返回值
    cout << *a;
    }

在这里插入图片描述
函数指针: 本质是一个指针,函数指针就是指向代码段中函数入口地址的指针。

类型 (*指针变量名)(参数列表);
exp:
	int cfun(int &a){
	    a=10000;
	    return a;
	}
	int main() {
	    int j=10;
	    int (*p)(int &)=cfun;//定义函数指针并初始化
	    int result=p(j);//调用函数指针
	    cout<<result;
	}

在这里插入图片描述

7.智能指针


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值