宝安公司免费网站建设,wordpress搭建软件下载,临淄网站建设多少钱,怎么找上海网站建设文章目录 1.字符指针变量2.数组指针变量3.函数指针变量4.函数指针数组5.二维数组传参本质6.拓展补充希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力#xff01; 本章节接着学习常见的指针变量类型
1.字符指针变量
字符指针变量#xff0c;顾名思义就是字… 文章目录 1.字符指针变量2.数组指针变量3.函数指针变量4.函数指针数组5.二维数组传参本质6.拓展补充希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力 本章节接着学习常见的指针变量类型
1.字符指针变量
字符指针变量顾名思义就是字符类型的指针即 char* 常见的输出格式是这样的
int main()
{char ch w;char *pc ch;*pc w;return 0;
}这是存放一个字符的情况如果存放字符串呢?
int main()
{const char* pstr hello bit.;printf(%s\n, pstr);return 0;
}乍一看是存放字符串在指针变量中但我们要记住指针变量是用来存放地址的 所以这里本质是把字符串 hello bit. 首字符的地址放到了pstr中即字符 h 的地址
2.数组指针变量
上一篇 vlog 学到了指针数组就是存放指针的数组也可以理解为存放指针的集合(元素相同)那么数组指针就可以得出是存放数组地址的指针是一种指针变量指向数组
int *p1[10];
int (*p2)[10];那么以上哪种是数组指针 答案是下面那个 分析[ ] 的优先级大于 * 所以必须加上 [ ] 来保证 p 和 * 优先结合
p先和 * 结合说明p是一个指针变量然后指针指向的是一个大小为10个整型的数组 所以 p 是一个指针指向一个数组叫数组指针
int 表示 p指向的数组的元素类型 p 是数组指针变量名10是指向数组的元素个数
3.函数指针变量
根据前面学过的类比不难发现函数指针变量应该是用来存放函数地址的通过地址能够调用函数的 那么函数真的有地址吗
#include stdio.h
void test()
{printf(hehe\n);
}
int main()
{printf(test: %p\n, test);printf(test: %p\n, test);return 0;
}通过以上代码可以发现函数确实有地址用函数名就能代表其地址当然也可以通过 函数名 的方 式获得函数的地址为了方便一般就不写取地址符 其语法形式为
int(*pf3)(int, int) Add;
int(*pf3)(int x, int y) Add;函数参数的变量名可写可不写取地址符也是 int 是指向函数的返回类型pf3 是函数指针变量名int xint y 是 pf3 指向函数的参数类型和个数
#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;
}可以将通过函数指针调用指针指向的函数写一个我们之前写过的加法函数 这里通过解引用函数指针 pf3 的方式来调用它所指向的函数也就是 Add 函数传入参数 2 和 3然后将返回的结果使用 printf 函数输出。实际上在这种情况下解引用操作符 * 在这里是可选的因为在 C 语言中函数名本身在求值时就会转换为指向该函数的指针所以也可以直接写成 pf3(2, 3) 4.函数指针数组
在学习了指针数组的基础上我们引入函数指针放入数组 那么以下哪种为正确的形式
int (*parr1[3])();
int *parr2[3]();
int (*)() parr3[3];答案是第一个 定义形式如下返回值类型 (*数组名[数组大小])(参数列表) parr1 先和 [ ] 结合说明 parr1是数组是 int (*)() 类型的函数指针 那么参数如何理解其实就是每个元素代表的函数
#include stdio.hint add(int a, int b) {return a b;
}int subtract(int a, int b) {return a - b;
}int main() {int (*func_array[2])(int, int) {add, subtract};return 0;
}在上述代码中func_array 数组的两个元素分别被初始化为 add 函数和 subtract 函数的指针
5.二维数组传参本质
讲数组的时候说过二维数组其实可以看做是每个元素是一维数组的数组也就是二维数组的每个元素是一个一维数组那么二维数组的首元素就是第一行是个一维数组 第一行的一维数组的类型就是 int [5] 所以第一行的地址的类型就是数组指针类型 int(*)[5] 那就意味着二维数组传参本质上也是传递了地址传递的是第一行这个一维数组的地址那么形参也是可以写成指针形式的总的来说就是把二维数组当一维数组理解第一行看成一维数组的第一个元素首元素就是第一行一整行的地址
#include stdio.hvoid test(int (*p)[5], int r, int c){int i 0;int j 0;for(i0; ir; i){for(j0; jc; j){printf(%d , *(*(pi)j));}printf(\n);}
}
int main()
{int arr[3][5] {{1,2,3,4,5}, {2,3,4,5,6},{3,4,5,6,7}};test(arr, 3, 5);return 0;
}普通的遍历数组传参也可以这样写 这里的 *(pi) 相当于获取二维数组的第 i 行的首地址因为 p 是指向包含 5 个整数的数组的指针pi 就指向了第 i 行然后 *(pi)j 就是指向第 i 行第 j 列元素的指针最后 ((pi)j) 就是获取该位置的元素值并输出 虽然解引用通常是获取元素本身但在指向二维数组行的指针这种特殊情况下由于指针所指向的对象本身就是一个数组解引用得到的就是这个数组的首地址这是由 C 语言的指针和数组特性共同决定的 二维数组传参形参的部分可以写成数组也可以写成指针形式 6.拓展补充
补充一个关键字 typedef 是用来类型重命名的可以将复杂的类型简单化
普通类型
typedef unsigned int uint;
//将unsigned int 重命名为uint普通指针类型
typedef int* ptr;数组函数指针类型
typedef int(*parr)[5]; //新的类型名必须在*的右边
typedef void(*pfun)(int);//新的类型名必须在*的右边下一期 vlog 将对二分查找转移表冒泡排序等常见算法题目进行练习解析 建议对前面的知识都有系统性的理解后再来写题 主页传送门DARLING Zero two♡ 的 blog 希望读者们多多三连支持
小编会继续更新
你们的鼓励就是我前进的动力