c语言--指针进阶

目录
1,字符指针.
2,数组指针.
3,指针数组.
4,数组参数和指针参数.
5,函数指针.
6,回调函数
.

正文开始:

一、字符指针

1、概念

字符指针顾名思义就是指向字符的指针变量

2、举例

char *ps="hello world";

*需要注意的是:字符指针与数组不同,数组存的是整个字符串,而字符指针变量存的是首字符地址;

实验验证上述观点:既然字符指针变量存的是首字母h的地址,则%c打印* ps结果应为’h‘,%s打印ps结果应为 ’hello world‘,如下图所示.

在这里插入图片描述
在这里插入图片描述

以上两个实验很好的证明了字符型指针变量中存放的是字符串首字符的地址

二、数组指针.

1、我们先来看看它的概念:

“数组指针,即是指向数组的指针。”

*2、数组指针的定义
int (pr) [10]=&arr;
注:本处假设arr数组元素类型为int 有十个元素

①*pr;说明pr为指针变量;
②[10];说明指针变量指向一个数组;
③int;说明指针指向数组的元素为int型;

2、区分数组名和&数组名

这里定义一个数组:int arr[5]={0}; 下面以arr数组为例

(1)arr指的是首元素地址;
(2)&arr指的是整个数组的地址;
(3)&arr和arr打印地址相同,但是一个要存放到数组指针中,另一个存放到int型指针中.
(4)arr走一步走一个整形,而&arr走一步走一个数组,即跳过本数组;

3、数组指针的定义

int (*pr)[5]=&arr;

*2、数组指针的定义
int (pr) [10]=&arr;
注:本处假设arr数组元素类型为int 有十个元素

①*pr;说明pr为指针变量;
②[10];说明指针变量指向一个数组;
③int;说明指针指向数组的元素为int型;

以打印二维数组为例:

在这里插入图片描述

此处应该声明:
1、arr为二维数组数组名,代表第一行元素,所以和一维数组的函数名不同;
2、解引用pa数组指针变量相当于拿到了整个数组,本质上拿到的是首元素地址;

对此代码的刨析:
1、调用函数部分传入实参arr实质上传入的是二维数组第一行元素(可以看作一维数组)的地址,所以定义函数时应用数组指针接收;
2、pa+i:代表第i行数组地址;
3、*(pa+i):对存储第i行整个数组地址的指针解引用,相当于拿到该行首元素地址,所以代表第i行数组的首元素地址;
4、加上u代表第i行第u列元素的地址;
5、最后解引用相当于拿到第i行第u列元素;

三、指针数组

1、概念

指针数组顾名思义就是存放指针的数组;

2、定义

int *arr[10]
//去除数组名和[10]就是数组的类型int * ,说明数组中元素为整形指针;
3、举例、
在这里插入图片描述
注:此处例子为利用指针数组打印三个数组元素;创建指针数组,存放三个数组的首元素地址(对应数组名).

四、数组参数和指针参数

本节主要内容为一维二维数组、一级指针、指针数组作为实参传参,定义函数时应用什么形参接收;

1、一维数组
实参:arr(数组名)
*形参:① arr[ ] ;②int pr

注:因为arr为数组名表示首元素地址,传入地址可以用指针来接收

2、二维数组

实参:arr[行数] [列数 ] 、arr[ ] [列数]、arr、;

注:二维数组传参时若加[][]则不可省略列数,可以省略行数;实参若为arr,则传入的是第一行一维数组的地址;两者传入后在定义函数中对数组元素的访问方式不同。

形参:可以为二维数组接收,与实参形式相对应,也可以用数组指针接收(对应实参arr),例子可以参考指针数组的用法;

3、一级指针传参

int a=10int *pr=&a;
print(pr);

此处print假设已经是定义的函数.不难看出实参为指针变量,而不是*pr。pr表示指针变量,传入的是a’的地址;而 *pr实质上是对pr解引用,代表变量a;若传入pr 则接收时应用一级指针作为形参接收实参;

4、指针数组传参

int *arr[10];
实参
传入数组名arr;

形参
①、由上述内容可知,指针数组是一个存放指针的数组,实参若传入数组名arr,则传过去的第一个元素的地址,又因为第一个元素是指针,所以形参应用二级指针接收;即int * *pr;
②、也可以用它本身的形式接收;

五、函数指针

1、函数指针定义;


函数指针就是指向函数的指针


2、函数指针如何定义;

举例:int (*pr) (int , int )=函数名;

*此处假设pr为指针变量,函数返回类型为int,参数类型为int int

①*pr说明pr为指针变量;
②int 说明pr指针指向的函数返回类型为int;
③(int a,int b)代表函数中参数类型;
④函数名相当于函数地址,且函数名=&函数名;

3、调用函数指针;

定义函数指针且将函数地址传到指针变量中后,可以通过指针变量调用函数,如下(设函数名为a):

*通过指针调用函数传参:pr(3,4)

注:因为函数名=&函数名,所以a(3,4)=&a(3,4),因为指针pr存放函数地址,所以a(3,4)=pr(3,4),以上四种调用均可;

六、回调函数

1、概念

回调函数就是一个被作为参数传递的函数

假设一个函数A一个函数B,A函数的形参设置为函数指针,这样调用函数时就可以将B函数的地址传入A函数,此时在A函数中通过指针就可以调用B函数;

示例:如图所示

在这里插入图片描述

如图,定义a函数和b函数,在主函数部分调用a函数传入b函数的地址,a函数定义形参函数指针接收b函数地址,在a函数中通过指针变量调用b函数打印“sss”。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值