指针知多少

作者简介:დ旧言~,目前大一,现在学习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

大家可以好好看看这两篇博客,对指针认识会更加深刻。

⛵结束语🎉🎉🎉

今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小说手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/27201.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习】多任务学习

多任务学习是一个很火的话题&#xff0c;在自动驾驶领域以及其他对存储资源要求较高的端侧任务&#xff0c;都会考虑这种方式。之前面试的时候也有被问题多任务学习。前几天看到一个写得很好的例子&#xff0c;在此记录一下&#xff0c;也好久没有写博客了。 1.参考 论文是20…

p2p大豆计数模型

前面学习了一下论文&#xff1a;Improved Field-Based Soybean Seed Counting and Localization with Feature Level Considered 论文链接&#xff1a;https://spj.science.org/doi/10.34133/plantphenomics.0026 解读链接&#xff1a;论文阅读--考虑特征水平的改进的基于田间…

如何在 3ds Max 中使用 Mental Ray 制作逼真的草地和带有光晕的天空

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 首先&#xff0c;您将创建一个平面对象&#xff0c;然后添加一个噪点修改器。在此之上应用毛发和毛皮修饰符。 这将用于模拟逼真的草地。 我们用日光系统创造太阳和天空。为太阳添加镜头和戒指效果以及酷炫…

ES6类-继承-Symbol-模版字符串

目录 类 继承 ES5 如何继承 ES6继承 Symbol 用途 可以产生唯一的值&#xff0c;独一无二的值 解决命名冲突 getOwnPropertySymbols() 作为全局注册表 缓存 Symbol.for() 消除魔术字符串 模版字符串 类 在javascript语言中&#xff0c;生成实例对象使用构造函数&#xf…

使用Linux Deploy搭建服务器(三)Linux Deploy安装宝塔面板

宝塔面板是一个免费的服务器管理平台&#xff0c;可以在你的服务器上安装它&#xff0c;然后你就能很方便的管理你的服务器&#xff0c;以及搭建各种服务平台&#xff0c;在此基础上我们可以使用内网穿透&#xff0c;搭建出自己的Linux服务器。可以这样一个相对便宜的方式&…

【数学建模】利用C语言来实现 太阳赤纬 太阳高度角 太阳方位角 计算和求解分析 树木树冠阴影面积与种植间距的编程计算分析研究

太阳赤纬的计算 #include <stdio.h> #include <math.h>double calculateDelta(int year, int month, int day, int hour, int minute, int second) {int n, n0;double t, theta, delta;// 计算n和n0n month * 30 day;n0 79.6764 0.2422 * (year - 1985) - ((y…

前端Vue仿微信我的菜单栏组件按钮组件

随着技术的发展&#xff0c;开发的复杂度也越来越高&#xff0c;传统开发方式将一个系统做成了整块应用&#xff0c;经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改&#xff0c;造成牵一发而动全身。 通过组件化开发&#xff0c;可以有效实现…

Oracle Profile概念与示例

Profile和SQL Profile是不同的&#xff0c;前者是用CREATE PROFILE创建&#xff0c;后者和SQL Tuning有关。 profile的定义为&#xff1a; which is a set of limits on database resources. If you assign the profile to a user, then that user cannot exceed these limits…

CAPL(vTESTStudio) - CAPL实现CANCANFD接收

诊断作为CAN&CANFD总线测试中最大也是很重要的一块内容,虽然测试过程比较简单,但是作为诊断接收函数,我想大家在测试中都会遇到多种多样的自研函数,经过多年的工作,我也是一直希望写出一个能够适配我所能想到的所有情况的诊断应答接收,以下函数是我最近对于诊断接收函…

右键pdf文件没有打印

问题描述 右键点pdf文件&#xff0c;弹出的菜单找不到打印选项。网上找了很多办法&#xff0c;然并卵啊。还是得靠自己慢慢摸索。 原因分析 新安装的win11系统&#xff0c;pdf文件默认可以用windows自带的edge浏览器打开。但是edge浏览器没有能力提供右键打印功能。 解决办法…

Vis相关的期刊会议

中国计算机学会推荐国际学术会议和期刊目录 文档&#xff0c; 下载 link&#xff1a;CCF推荐国际学术刊物目录-中国计算机学会 一.可视化方向文章 1.IEEE VIS&#xff0c;是由 IEEE Visualization and Graphics Technical Committee(VGTC) 主办的数据可视化领域的顶级会议&a…

RuoYi-Vue/vue项目访问 webpack 中定义的变量

前言 RuoYi-Vue 3.8.4 webpack 中定义的变量 vue.config.js 中定义的 webpack 的变量 在html页面中&#xff0c;如何访问 webpack 的变量 <title><% webpackConfig.name %></title>参考&#xff1a;ruoyi-ui/public/index.html 文件