目录
1.字符指针变量
2.数组指针变量
3.二维数组传参本质
4.函数指针变量
5.函数指针数组
6.转移表
1.字符指针变量
char*p="abcdef"//abcdef是常量字符串
//常量字符串不能被修改。
如上图中的赋值只是把字符串首字符的地址赋给了指针变量p.不信请看下图:
那如果我想打印abcdefg呢?只需要提供首字符 的地址就行。不需要解引用。另外记得打印字符串用%s,如下图:
注意:常量字符串是不能被修改的。,如下,所以我们一般会在前面加个const,提醒自己。
const char*p="fxkszsd";
再重复一遍,以上代码只是把字符串首字母的 地址放在了指针变量p ,而不是整个字符串放了进去。
2.数组指针变量
2.1数组指针变量是什么?
类比:
字符指针:——char*——指向字符的指针——字符指针变量中存放字符变量的地址。
char code='f';
char*p=&code;
整形指针:——int*——指向整形的指针——整形指针变量中存放整型变量 的地址
int a=10;
int*p=&a;
数组指针:——指向数组 的指针——数组指针变量存放数组的地址(&数组名)。
数组指针变量格式如下:
int fxk[10]={1,2,3,4};
int (*p)[10]=&fxk;
//p就是数组指针变量,
//p中存放的是数组的地址。
//去掉p就是数组指针类型。
//(*p)是数组指针。
2.2数组指针如何初始化
3.二维数组传参的本质
我们都知道,一维数组传参的时候,其实传递的是首元素的地址,函数的参数可以写成数组,也可以写成指针。
二维数组呢?二维数组的数组名是如何理解的呢?其实二维数组的数组名也是数组首元素的地址。
二维数组的每一行可以看做一个一维数组,所以二维数组其实是一个一维数组的数组,所以二维数组的首元素就是它的第一行
二维数组的数组名就是第一行的地址
二维数组传参的本质也是传递了地址,传递 的是第一行这个一维数组的地址。
int fxk[3][5]=
{{1,2,3,4,5}
{2,3,4,5,6}
{3,4,5,6,7}];
fxk[i]==*(fxk+i)
//当i=0,左边fxk[0]就是数组的第一行,
//右边fxk表示首行元素的地址,
//对它进行解引用就是首行元素,
//两者相等。
fxk[i][j]=*(*(fxk+i)+j)
//如果实在看不懂,
//就把i和j换成具体的数值
不管是一维数组还是二维数组传参,形参可以写成数组也可以写成指针。
4.函数指针变量
4.1函数指针变量的创建
变量有地址,数组也有地址,那么函数有没有地址呢?啊答案是有的。
&函数名和函数名都是函数的地址,它们没有区别。
printf("%p",Add);
printf("%p",&Add);
没区别的
函数指针变量形式:
int Add(int a,int b)
{return a+b;}
int main()
{
int a=0;
int b=0;
Add(a,b);
int (*p)(int ,int)=&Add;
//p就是函数指针变量
//去掉p就是函数指针类型
int answer=(*p)(1,2);
//这就是通过指针调用函数
//*写不写都行,因为函数名就是地址
return 0;
}
4.2typedef关键字
typedef是用来重命名的,比如你写unsigned int会觉得麻烦,那可以使用typedef给unsigned int 换个名字。
typedef unsigned int ugn;
ugn a=0;
//这其实就是把unsigned int改成了ugn.
不只是数据类型,对指针重命名也是可以的。
typedef int* ddd;
///ddd==int*
int a=10;
int*p=&a;
ddd p1=&a;
对数组指针也同样有效
注意:
去掉数组指针变量名字就是指针变量类型
,但是我们创建的那个新的名字不能跟上面一样直接写在后面,而是放在原来名字的位置。
typedef int (*parr_t)[6] ;
//
int fxk[6]={1,2,3,4,5,6};
int (*p)[6]=&fxk;
parr_t p1=&fxk;
函数指针也是同理:
去掉函数名就是函数指针类型。
重命名的名字要放在原来的名字上。
int Add(int a,int b)
{return a+b;}
typedef int(*ddd)(int,int)
int main()
{
int a,b=0;
Add(a,b);
int(*p)(int,int)=Add;//函数名就是地址
//不需要&
return 0;
}
5.函数指针数组
顾名思义:就是存放函数指针的数组。
int (*p1)(int ,int )=Add;
int (*p2)(int ,int )=Sub;
int (*p3)(int ,int )=Mul;
int (*p4)(int ,int )=Div;
int (*p[4])(int ,int)=
{Add,Sub,Mul,Div};
//p就是函数指针数组名字
6.转移表
本质:函数指针数组
复杂版本:
一对比你就能感觉到函数指针数组的作用