c语言指针进阶

c语言指针进阶

  1. 字符指针
    (1)字符指针是用来字符变量的地址
    (2)字符指针的使用:
    第一种
    char ch = ‘o’;
    char* p = &ch;
    第二种:
    char* p = “ahsdj”;

补充:字符串常量是无数名的字符数组,是一个特殊的字符数组。
将一个字符串常量赋个一个字符指针,是将字符串常量的首元素地址赋个字符指针。常量不储存在栈区

这里有个面试题:
在这里插入图片描述
在这里插入图片描述
这里str3和str4指向的是一个同一个常量字符串。C/C++会把常量字符串存储到单独的一个内存区域,当
几个指针。指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化
不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4不同。

  1. 指针数组
    (1) 指针数组:用来从存放指针的,即每一个元素都是一个指针
    在这里插入图片描述
  2. 数组指针
    (1) 数组指针是一个指针
    (2) 数组指针是一个指向数组的指针
    (3)首先先理解数组类型、数组名和&数组名的含义
    1…数组类型
    我们在创建数组类型的时候,都是 元素类型+数组名+[长度],
    数组类型就是在创建数组的时候将数组名去掉的剩余部分
    例如:int arr[10]----->数组类型:int [10]
    char arr[5]------>数组类型: char [5]
    2…数组名和&数组名
    (1)数组名是一个常量,数组名是不能被修改的
    例如:
    char arr[21];
    arr = arr+1;
    这是一个错误的代码
    (2)我们在 使用数组名的时候,除了在sizeof(数组名)的情况下,数组名是表示整个数组,在其他的情况下,数组名表示数组首元素的地址
    (3)每一个字节都有自己的地址,但是,我们在&(取地址)的时候,所取出来的是最小的地址
    (4)数组在内存开辟空间的时候,是一次性开辟出所需要的空间,在从低地址开始分配空间,所以,首元素的地址在数组中是最小的
    (5)数组名和&数组名表示的都是地址并且数值都是一样的,但是,数组名不等于(!=)&数组名,因为,他们的指针类型不同,(解引用)时 和加减(+ -)整数时,访问的步长不同,
    在这里插入图片描述
    3…数组指针的定义和使用
    (1)指针在定义的时候:指向元素的类型+
    +指针变量名
    数组指针的定义也是一样的:数组类型++指针变量名
    只不过
    变量名要有括号()括起来夹在数组类型的中间
    例如:int arr[10];
    int (*p)[10] = &arr;
    (2)*数组指针—>相当于所指向数组的数组名,然后,我们再用操作数组名的方式进行操作,来访问数组元素
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    3.数组传参
    (1)一维数组传参
    本质传的是指针,形参可以用数组的形式来接收,也可以用相应的指针来接收
    (2)二维数组传参
    本质传的是指针,形参可以用数组的形式来接收,也可以用相应的指针来接收
    需要注意的是:二维数组每一个元素是一个一维数组,所以,在一指针来接收的时候,要有数组指针来接收

4.函数指针
(1)我们在定义完一个函数后,函数也有自己的地址
(2)函数名和&函数名的理解
函数跟数组不同函数名和&(取地址)函数名是一样的,都是表示函数的地址,即 函数名=&函数名
(3)函数类型的理解
我们在定义函数的时候,返回类型+函数名(类型 形参变量,…)
函数类型:返回类型 (类型 形参变量,…)形参变量可以不写
(4)函数指针的定义和使用
1…函数指针的定义:函数类型++指针变量名
即 返回类型 (指针变量名)(类型 形参变量,…)形参变量可以不写
例如:
int (p)()= test;
2…函数指针的使用
函数指针的使用 进行函数的调用
:函数指针(实参)—>解引用(
)可写可不写
由此,我们可以知道,我们在使用函数指针的时候 解引用操作符(
)只是摆设 ,使用多个
都没问题,不使用也行在这里插入图片描述
由此,我们可以知道,我们在使用函数指针的时候 解引用操作符()只是摆设 ,使用多个都没问题,不使用也行在这里插入图片描述
5.函数指针数组
(1)每一个元素是一个函数指针类型
(2)函数指针类型+数组名+[长度]
例如:int (*p[5])(int,int)
(3)函数指针数组的使用———————— 转移表

在这里插入图片描述
6. 指向函数指针数组的指针
(1) 指向函数指针数组的指针是一个 指针
指针指向一个 数组 ,数组的元素都是 函数指针
例如:
int(p[2])(int,int) = {add,ji};
int(
(*pp)[2])(int,int) = &p;

  1. 回调函数
    (1)回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个
    函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数
    的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进
    行响应。
    (2)回调函数的使用---->qsort函数
    qsort函数是一个排序函数(使用于任意类型)
    在这里插入图片描述
    qsort函数的使用
    在这里插入图片描述
    模拟qsort函数
    在这里插入图片描述
  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值