作者简介:დ旧言~,目前大一,现在学习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");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;
}
这里加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);}elseprintf("输入有误\n");printf("ret = %d\n", ret);}return 0;
}
⑦指向函数指针数组的指针
这里我就不在介绍了,大家自己上网查阅,看看这块知识点。
⛵指针拓展与练习
💦练习
https://blog.csdn.net/AAlykk/article/details/131631154
💦拓展
https://blog.csdn.net/AAlykk/article/details/131599017
大家可以好好看看这两篇博客,对指针认识会更加深刻。
⛵结束语🎉🎉🎉
今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小说手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。