企业网站建设58同城,下载app并安装到手机,深圳网站制作哪家好薇,wordpress 标签显示系列文章目录 文章目录 系列文章目录前言系列文章目录前言1. 字符指针变量2. 数组指针变量那数组指针变量应该是#xff1a;存放的应该是数组的地址#xff0c;能够指向数组的指针变量。2.2 数组指针变量怎么初始化总结#xff1a;函数名就是地址#xff0c;函数名和直…系列文章目录 文章目录 系列文章目录前言系列文章目录前言1. 字符指针变量2. 数组指针变量那数组指针变量应该是存放的应该是数组的地址能够指向数组的指针变量。2.2 数组指针变量怎么初始化总结函数名就是地址函数名和直接使用函数名是一样的。 3 .函数指针变量函数指针变量是⽤来存放函数地址的未来通过地址能够调⽤函数的。3.1 函数指针变量的使⽤ 4 .typedef关键字数组指针和函数指针稍微有点区别 5. 函数指针数组 前言
系列文章目录
前言
学习字符指针变量数组指针变量函数指针变量函数指针数组三个变量要有所理解还有、函数指针数是重点内容。
1. 字符指针变量
为了加强理解。来我们来看如下代码
int main()
{const char* pstr hello bit.;//这⾥是把⼀个字符串放到pstr指针变量⾥了吗printf(%s\n, pstr);return 0;
}其实并不是这样的他是像字符串一样把首字符的地址放到指针pstr里面了为了让你们理解如图 扩展⼀道和字符串相关的笔试题
#include stdio.h
int main()
{char str1[] hello bit.;char str2[] hello bit.;const char *str3 hello bit.;const char *str4 hello bit.;if(str1 str2)printf(str1 and str2 are same\n);elseprintf(str1 and str2 are not same\n);if(str3 str4)printf(str3 and str4 are same\n);elseprintf(str3 and str4 are not same\n);return 0;
}运行结果 这是为什么呢其实这⾥str3和str4指向的是⼀个同⼀个常量字符串C/C会把常量字符串存储到单独的⼀个内存区域当⼏个指针指向同⼀个字符串的时候他们实际会指向同⼀块内存。但是⽤相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同str3和str4相同。
2. 数组指针变量
数组指针数组指针强调的是指针怎么理解呢 (1)整形指针变量 int * pint; 存放的是整形变量的地址能够指向整形数据的指针。 2)浮点型指针变量 float * pf; 存放浮点型变量的地址能够指向浮点型数据的指针。
那数组指针变量应该是存放的应该是数组的地址能够指向数组的指针变量。
那么我们来理解两句代码 int *p1[10];int (*p2)[10];思考一下p1,p2分别是什么 正确答案是p1是数组指针p2是指针数组 怎么理解这⾥要注意[]的优先级要⾼于*号的但是优先级高于[ ],所以可以利用优先级理解就如上面代码 p1[ ]的优先级高于 星号的先和[ ]结合说明p1是数组数组10个元素每个元素的类型是int *所以p1是指针数组。 p2 的优先级高于[ ],*p2则说明p2是指针在和[ ]结合说明是数组所以p2是数组指针。 2.2 数组指针变量怎么初始化
数组指针变量是⽤来存放数组地址的那怎么获得数组的地址呢就是我们之前学习的 数组名这是整个数组放入。
操作如下 int(*p)[10] arr;调试下 看到 arr 和 p 的类型是完全⼀致的。
总结函数名就是地址函数名和直接使用函数名是一样的。
数组指针类型解析 int (*p) [10] arr;| | || | || | p指向数组元素个数| p是数组指针变量名p指向的数组的元素类型3 .函数指针变量
函数指针变量是⽤来存放函数地址的未来通过地址能够调⽤函数的。
函数是有地址的函数名就是函数的地址当然也可以通过 函数名 的⽅式获得函数的地址如果我们要将函数的地址存放起来就得创建函数指针变量咯函数指针变量的写法其实和数组指针⾮常类似。如下
//第1种
void test()
{printf(hehe\n);
}
void (*pf1)() test;
void (*pf2)() test;//第2种
int Add(int x, int y)
{return xy;
}
int(*pf3)(int, int) Add;
int(*pf3)(int x, int y) Add;//x和y写上或者省略都是可以的函数指针类型解析 int (*p) int x, int y)| | || | || | pf3指向函数的参数类型和个数的交代,| 函数指针变量名pf3指向函数的返回类型int (*) (int x, int y) //pf3函数指针变量的类型3.1 函数指针变量的使⽤
通过函数指针调⽤指针指向的函数
#include stdio.h
int Add(int x, int y)
{return xy;
}
int main()
{int(*pf3)(int, int) Add;printf(%d\n, (*pf3)(2, 3));printf(%d\n, pf3(3, 5));//*在这里可有可无因为函数名也是函数地址return 0;
}输出结果 5 8
4 .typedef关键字
ypedef 是⽤来类型重命名的可以将复杂的类型简单化。
⽐如你觉得 unsigned int 写起来不⽅便如果能写成 uint 就⽅便多了那么我们可以使⽤ typedef unsigned int uint;//将unsigned int 重命名为uint果是指针类型能否重命名呢其实也是可以的⽐如将 int* 重命名为 ptr_t ,这样写 typedef int* ptr_t;//将int * 重命名为 ptr_t数组指针和函数指针稍微有点区别
数组指针类型 int(*)[5] ,需要重命名为 parr_t 那可以这样写 typedef int(*parr_t)[5]; //新的类型名必须在*的右边函数指针类型的重命名也是和数组指针类型⼀样的⽐如将 void(*)(int) 类型重命名为 pf_t ,就可以这样写 typedef void(*pfun_t)(int);//新的类型名必须在*的右边练习
代码1(*(void (*)())0)();
代码2void (*signal(int , void(*)(int)))(int);那么要简化代码可以这样写
typedef void(*pfun_t)(int);
pfun_t signal(int, pfun_t);5. 函数指针数组
数组是⼀个存放相同类型数据的存储空间我们已经学习了指针数组如 int *arr[10];//数组的每个元素是int*那要把函数的地址存到⼀个数组中那这个数组就叫函数指针数组那函数指针的数组如何定义呢 int (*parr1[3])();可以向之前利用优先级理解第1里面是指针数组把parr1 [3]删除后是int * 是函数指针如图 好了今天就到这里了下次我们再说说函数指针数组的用途都看到这里了点点赞把谢谢你的观看