作者简介:დ旧言~,目前大一,现在学习Java,c,Python等
座右铭:松树千年终是朽,槿花一日自为荣。
望小伙伴们点赞👍收藏✨加关注哟💕💕
⛵前言
不知道大家还记不记得初阶的指针☺️,那时我们讲的很浅🤔,只是知道有指针这玩意,看起来也迷迷糊糊😒,今天我们系统的来讲解指针,到底看看指针是否向传闻中的难到哭😮💨,话不多说正式进入今天的主题—C语言指针进阶 。
⛵主体
①字符指针
💤字符指针是什么
字符指针 == char* p
💤字符指针使用
#include<stdio.h> int main() { char* ptr = "hello world."; printf("%s\n", ptr); return 0; }
💦"hello world."字符串本质上是把首元素的地址给字符指针(首字符h的地址存放到指针变量ptr中)
💤举个栗子
#include <stdio.h> int main() { char str1[] = "hello world."; char str2[] = "hello world."; const char* str3 = "hello world."; const char* str4 = "hello world."; if (str1 == str2) printf("str1 and str2 are same\n"); else printf("str1 and str2 are not same\n"); if (str3 == str4) printf("str3 and str4 are same\n"); else printf("str3 and str4 are not same\n"); return 0; }
这里加const修饰的变量是不可以被修改的,而上面的代码结果是什么呢?让我们仔细来探讨探讨。🧐🧐🧐
不难看出,str1和str2分别开辟了不同空间,而被const修饰的"hello world."已在栈区开辟好了空间,因此str3和str4都指向同一个字符串。
②指针数组
💤指针数组是什么
指针数组 == int* p[10]
这里我们要明白,指针数组是指针还是数组?这里我们仔细来讲解,因为[]的优先级比 * 高,因此p是一个数组,有10个元素,每个元素的类型都是 int *,因此指针数组,本质还是数组。
这里我就不举例了,这里会和数组指针一起来举例子。
③数组指针
💤数组指针是什么
数组指针 == int(* p)[10]
这里我们要明白,指针数组是指针还是数组?这里我们仔细来讲解,因为()的优先级比 [] 高,因此p是一个指针,指向数组,数组有10个元素,因此数组指针,本质还是指针。
💤数组指针和指针数组比较
指针数组 == int* p[10] ➡️本质是数组
数组指针 == int(* p)[10] ➡️本质是指针
💤&数组名VS数组名
&数组名VS数组名都表示数组首元素的地址,但是有特例:
💫特例:
1️⃣sizeof(数组名):表示的是整个数组
2️⃣&数组名:取出的是整个数组
💤数组指针使用
大家不知道有没有看过博主的写的三子棋和扫雷,这里就用到数组指针,
#include <stdio.h> void print_arr1(int arr[3][5], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { printf("%d ", arr[i][j]); } printf("\n"); } } void print_arr2(int(*arr)[5], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { printf("%d ", arr[i][j]); } printf("\n"); } } int main() { //定义一个二维数组 int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10 }; //调用函数 print_arr1(arr, 3, 5); print_arr2(arr, 3, 5); return 0; }
这里我们写上主函数,定义一个二维数组,开始调用函数,第一个函数使用最初我们常见的知识写的,后面的函数采用数组指针。
💤举个栗子
1️⃣int arr[5];
2️⃣int *arr1[10];
3️⃣int (*arr2)[10];
4️⃣int (*arr3[10])[5];
1.arr是个数组,数组里面有5个元素,每个元素类型为int。
2.arr是个数组,数组里面有10个元素,每个元素类型为int*。
3.arr是个指针,指针指向一个数组,数组有10个元素,每个元素类型为int。
4.arr是个数组,数组有10个元素,每个元素是个指针,指向一个数组,数组有5个元素,每个元素类型为int。
④指针参数
💤一级指针传参
#include <stdio.h> void print(int *p, int sz) { int i = 0; for(i=0; i<sz; i++) { printf("%d\n", *(p+i)); } } int main() { int arr[10] = {1,2,3,4,5,6,7,8,9}; int *p = arr; int sz = sizeof(arr)/sizeof(arr[0]); //一级指针p,传给函数 print(p, sz); return 0; }
💤二级指针传参
#include <stdio.h> void test(int** ptr) { printf("num = %d\n", **ptr); } int main() { int n = 10; int* p = &n; int** pp = &p; test(pp); test(&p); return 0; }
⑤函数指针
💤函数指针是什么
函数指针 == int (*p)(int ,int )
这里我们要明白,函数指针是指针还是函数?这里我们仔细来讲解,p是一个指针,指向函数,返回类型为int,因此函数指针,本质还是指针。
⑥函数指针数组
💤函数指针数组是什么
函数指针数组 == int (*p[10])(int ,int )
这里我们可以解读为,有一个数组,数组的元素有10个,每个元素是指针,并且指向函数,返回类型是int
💤举个栗子
这里我们再实现简单的计算机。
💤方法一
#include <stdio.h> int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } int mul(int a, int b) { return a * b; } int div(int a, int b) { return a / b; } int main() { int x, y; int input = 1; int ret = 0; do { printf("*************************\n"); printf(" 1:add 2:sub \n"); printf(" 3:mul 4:div \n"); printf("*************************\n"); printf("请选择:"); scanf("%d", &input); switch (input) { case 1: printf("输入操作数:"); scanf("%d %d", &x, &y); ret = add(x, y); printf("ret = %d\n", ret); break; case 2: printf("输入操作数:"); scanf("%d %d", &x, &y); ret = sub(x, y); printf("ret = %d\n", ret); break; case 3: printf("输入操作数:"); scanf("%d %d", &x, &y); ret = mul(x, y); printf("ret = %d\n", ret); break; case 4: printf("输入操作数:"); scanf("%d %d", &x, &y); ret = div(x, y); printf("ret = %d\n", ret); break; case 0: printf("退出程序\n"); break; default: printf("选择错误\n"); break; } } while (input); return 0; }
向上面的代码,是我们学函数的时候使用的方法,那我们用函数指针数组咋办呢?
💤方法二
#include <stdio.h> int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } int mul(int a, int b) { return a * b; } int div(int a, int b) { return a / b; } int main() { int x, y; int input = 1; int ret = 0; //这里我们传入函数的地址,实现选择 int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; while (input) { printf("*************************\n"); printf(" 1:add 2:sub \n"); printf(" 3:mul 4:div \n"); printf("*************************\n"); printf("请选择:"); scanf("%d", &input); if ((input <= 4 && input >= 1)) { printf("输入操作数:"); scanf("%d %d", &x, &y); ret = (*p[input])(x, y); } else printf("输入有误\n"); printf("ret = %d\n", ret); } return 0; }
⑦指向函数指针数组的指针
这里我就不在介绍了,大家自己上网查阅,看看这块知识点。
⛵指针拓展与练习
⛵结束语🎉🎉🎉
今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小说手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。