深入理解指针(3)

目录

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]=
{{12345}
{23456}
{34567}];
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.转移表

本质:函数指针数组
在这里插入图片描述

复杂版本:
在这里插入图片描述
一对比你就能感觉到函数指针数组的作用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值