指针复习

指针快速复习笔记

复习原因:webots里的一个api是:

const double *wwb_inertial_unit_get_roll_pitch_yaw(imu);

可看第四和第十点

即函数返回值是指向是指向常量的指针,意思是指向的地址保存的值无法通过该指针修改,但是该指针的指向是可变的。

即wwb_inertial_unit_get_roll_pitch_yaw为函数名,const double *函数传回来的是一个指针,指针指向的是const double 的数据,这个指针可以变,但是指向的数据不能变。

指针笔记

前提:内存空间的访问方法

1.通过变量名访问

2.通过地址访问

指针(地址类型的变量,用于容纳地址的变量):内存地址,用于间接访问内存单元。

指针变量:用于存放地址的变量。

例:

一、指针的定义
static int i;

static int* ptr = &i;

在这里插入图片描述
定义变量i,在内存中分配若干字节,比如四个字节用于存放 int类型的数据,系统分配一个内存空间地址为2000,并起名为i,从此 可通过i这个变量名去访问地址为2000的内存空间

再定义指针变量ptr,存放地址用的变量。里面放的是2000这个地址。注意ptr自己也是个变量,它也要占内存空间,该空间地址为:3010。只不过ptr内容很特殊必须要是地址。

&是计算地址的运算符,&i即把i的地址计算出来返回给前面的式子初始化ptr。

表示正在定义的变量是指针,而 *号前面的int则表示指针指向对象的类型*。如果不知道对象是什么类型,当拿着2000去找到2000为起始地址的内存空间去取数据,不知道要取多少字节。

二、定义后指针的使用

例;

ptr = 3; 在这里插入图片描述
这时不是在定义的时候,
表示的是指针运算符,指的是按照变量ptr里的地址去寻找这个地址对应的内存单元(即寻址),然后访问该地址的内存空间。

三、指针变量初始化和赋值

语法形式:

存储类型 数据类型 *指针名 = 初始地址。

例: int *pa = &a;

注:存储类型指静态变量或者外部全局变量等等(static,extern)

允许定义或声明指向void类型的指针。该指针可以被赋予任何类型对象的地址。但只能存放地址,不能用于访问内存空间。

例:

void *ptr;

int i = 5;

ptr = &i;

int *pint = static_cast<int *>(ptr);//void指针转换为int指针;

*注意:不能出现 ptr的操作,因为void没有声明指针指向的对象类型不能访问内存。

四、指向常量的指针

在指针定义前面加const,指针所指向的对象是一个常量。

但指针本身不是一个常量,指针本身可以改变。

int a;

const int *p1 = &a;//p1是指向常量的指针

//可以把const int看为一个整体共同描述指针所致对象。

int b;

p1 = &b;//正确,p1本身可变

*p1 = 1//编译时错误不能通过p1改变所致的对象
五、指针类型的常量

即指针为常量的指针

int a;

int * const p2 = &a;

p2 = &b;//错误,p2值不能变。
六、指针类型的算术运算

1.指针p加上或减去n

其意义是指针当前指向位置的前方或后方第n个数据的起始位置。

2.指针的++、**–**运算意义是指向下一个或前一个完整数据的起始

3.运算结果取决于指针指向的数据类型,总是指向一个完整数据的起始位置

4.指针指向连续存储的同类型数据,加减自增才有意义

例:

short a[4];

short *pa = a;//指向数组第一位 short两个字节,所以加一如下
在这里插入图片描述

七、用指针访问数组元素
1.定义与赋值:

int a[10],*pa;

pa = &a[0];//a[0]地址赋值给pa

或pa = a;//因为数组名也是数组的首地址。

2.等效的形式:

*pa就是a[0], ( *pa即访问pa这个指针变量内存放的地址对应的内存空间)

*(pa+1)就是a[1]。

*a[i],*(pa+i),pa[i], (a+i)都是等效的。

a本身就是个地址类型常量,*(a+i)即对a+i进行指针运算

八、指针数组

例:Point *pa[2];//两个指针pa[0],pa[1];

九、指针做函数参数

这种用法比较重要

为什么需要用指针做参数?

1.需要数据双向传递时(引用也可达到此效果)。

2.需要传递一组数据,只传首地址效率高。

例子:void func(int* a);

十、指针类型的函数

即函数的返回值时指针

指针函数定义形式

存储类型 数据类型 *函数名()

{

}

注意:1.不要将非静态的局部地址作为函数的返回值。(非静态局部离开函数就消失了,很危险,不知道访问的是什么东西。)

正确例子

int main(){

int array[10];

int * zeroptr = search(array,10);//array 数组的首地址传给子函数

return 0;

}

int* search(int* a, int num){//指针a指向主函数中定义的数组

for(int i = 0; i <num;I++)

if(a[i] == 0)

return &a[i];//返回的地址指向的元素

}
十一、指向函数的指针

函数指针定义

存储类型 数据类型 (*函数指针名)();(这个括号一定要有)

含义:

函数指针指向的是程序代码的存储区。

可以实现函数的回调:
在这里插入图片描述
在这里插入图片描述

注:内容总结自郑莉老师C++网课
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值