指针的进阶
看完 指针初阶再这个
字符指针
在指针类型中我们知道有一种指针为字符指针char*;
其实并不是,本质上只是把hello world 首字母的地址放在了s中;
那么就有可能有这样一道面试题
str1和str2开辟了不同的内存块,而str3和str4指向了同一块内存
指针数组
指针数组是一个存放指针的数组
arr1先和[ ]先结合,表示是一个数组,数组里面有三个int*元素,
数组指针
数组指针的定义
那么数组指针是指针?还是数组?
答案是指针。
我们熟悉的
int* p,是能够指向整型数据的指针
char* c,是能够指向字符数据的指针
那数组指针应该是:指向数组的指针
ps和先结合表示一个指针,这个指针指向有5个int元素的数组;
ps是变量。返回类型是int ()[5]
&数组名vs数组名
我们知道数组名表示的是数组首元素的地址
那&数组名到底是什么?
结果数组名和&数组名打印的地址是一样的
难道两个是一样的东西?
我们再看下面的代码
这个结果我们就可以看出,虽然数组名和&数组名,虽然值一样,但是它们代表的意义却是不一样的。
&数组名+1跳过的是整个数组的地址,所以&arr+1与&arr的值相差40
数组指针的应用
其实*(*(pi+i)+j)相当于pi[ i ][ j ];
数组传参,指针传参
一维数组传参
二维数组传参
一级指针传参
二级指针传参
函数指针
函数指针根据上面的内容,我们就明白了,函数指针是指向函数的指针
p先和结合代表指针,(int,int)是函数的两个参数类型,最左边的那个int是函数的返回类型。
p是变量 int()(int,int)是返回类型
其实test不加&也是一样的,对于函数来说,&函数名和函数名都是函数的地址,
p是保存函数地址的指针,而调用这个函数就是要找到函数的地址。
函数指针数组
把函数地址存到一个数组中,那么这个数组就叫函数指针数组。
p和[5]先结合,表示一个数组,里面有5个元素,每个元素都是一个函数指针
函数指针数组的应用
实现简单的计算器
普通代码
代码归于冗余
我们使用函数指针所写的代码
使用函数指针数组的代码