文章目录
指针快速复习笔记
复习原因: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++网课
}