-指针用算
指针+ - 整数
例:获取数组中最后一个元素的地址(arr+size-1或&arr[size+1])
示例代码:
输出结果:
指针-指针
指针-指针会得到俩个指针中间元素的个数(可以用来求字符串的长度)
注意:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的内存位置的指针进行比较
-指针与数组
*数组名是首元素的地址
int arr[ ]; int* p=arr;
就有:arr+i<--->&arr[0]+i<--->p+i<--->&arr[i];
*(arr+i)<--->arr[i]<--->*(p+i)<--->p[i];
tips:
1.arr[i]可以理解为数组首元素的地址偏移i个元素的大小,然后取出该地址中的内容
2.arr可以当作p来使用,p也可以当作arr来使用,其实俩者完全不同(从值来看,arr与p是相同的,从类型来看,p的类型为int*,arr是数组名,类型为int[7])
*特例:1.&数组名中,数组名不是首元素的地址,数组名表示整个数组,&数组名,取出的是整个数组的地址
2.sizeof(数组名)数组名表示整个数组,sizeof(数组名)计算的是整个数组的大小
指针数组
指针数组是数组,并且是存放指针的数组
例:int* arr[4]是一个指针数组
数组指针
数组指针是指针,并且是指向该数组的指针
例:int (*arr)[4]是一个数组指针
-const关键字
const的基本含义
const是constant的缩写,意思是“恒定不变的量”,在C语言中,使用const修饰变量,表示这个变量不可以被修改,拥有只读属性,不能通过变量名进行赋值或者递增,递减操作
基本用法
1.修饰普通变量
格式:数据类型 const 变量名=值 或 const 数据类型 变量名=值
示例代码:
输出结果:
(如果变量名通过const进行修饰,则变量名拥有了只读属性,gcc编译器会在编译阶段进行检查,查看用户是否通过变量名来操作,若是操作了则会编译错误)
2.修饰指针变量
const除了能修饰变量外,还可以修饰指针,修饰指针有以下几种用法:
1> int const *p; //指针p本身的值可以改,但是p所指向的内容不能改(*p不能改)
2> const int *p; //指针p本身的值可以改,但是p所指向的内容不能改(*p不能改)
3> int *const p; //指针p本身的值不能改,但是p所指向的内容可以改(p不能改)
4>int const* const p; //指针p本身的值不能改,并且p所指向的内容也不能改(p和*p都不能改)
5>const int* const p; //指针p本身的值不能改,并且p所指向的内容也不能改(p和*p都不能改)
常量指针:说的是不能通过这个指针改变变量的值
示例:const int* j=&i;(const后面修饰int*,表示不能通过指针改变变量的值)
指针常量:说明指针本身就是个常量,指针中存储的地址不能修改
示例:int* const j=&i;(const后面修饰的为 j,表示指针中存储的地址不能更改)
-指针函数
指针函数本质上是一个函数,只不过返回值是一个地址
格式:返回值类型* 函数名称 (类型1,参数1,类型2,参数2,...);
示例代码:
输出结果:
函数指针
概述:函数指针,就是指向函数的指针
获取函数地址的方式:&函数名 与 函数名 都可以得到函数的地址
使用指针变量指向函数的地址:
int getmax(int a,int b);
int (*fump)(int,int)=getmax;(或 int (*fump)(int,int)=&getmax;)
回调函数
概述:回调函数就是把函数的地址作为参数传递给另一个函数,在另一个函数中通过指针来接收,并通过指针来调用其函数