【C语言】带你彻底理解指针(1)
✨✨✨✨如果文章对你有帮助记得点赞收藏关注哦!!✨✨✨✨
文章目录
- 指针的介绍:
- 一、简单指针🌈
- 1.1 指针的定义与使用
- 1.2 指针与数组
- 二、指针数组✨
- 三、数组指针🌞
- 3.1 数组指针的定义
- 3.2 ”数组名“与”&数组名“
- 3.3 数组指针使用
- 四、函数指针🤓
- 4.1函数指针的使用
- 五、函数指针数组🚀
- 5.1 函数指针数组的使用
- 完结
指针的介绍:
- 指针是一个用来存放地址的变量,可以通过指针存放的地址找到对应位置的值,对其进行使用。
- 指针在32位平台下的大小是4个字节,在64位平台下是8个字节。(这是因为32位平台下内存地址是由32根地址线组成,一根地址线就是1bit,用4个字节就可以存下,而64位平台有64根地址线,需要八个字节才可以存下)。
- 如果对指针进行加减与解引用操作,则±的步长与解引用操作的长度由指针类型决定,指针类型是几个字节±步长与解引用就是几个字节。
一、简单指针🌈
char* pc(字符指针)
int *pi(整形指针)
float* pf(浮点型指针)
还有short…double等等,拿部分举例。
1.1 指针的定义与使用
- 这三种指针的用法基本相同,只不过char*指针存放的是char变量地址,int型指针存放的是int变量地址,float指针存放的是float变量地址。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>int main()
{char a = 'a'; //定义一个char类型变量char* pa = &a; //*号先与pa结合说明pa是一个指针类型,指向的是char型数据的地址,将a的地址给到pa*pa = 'b'; //通过pa改变a的值printf("%c", a); // bint num = 10; int* pnum = #*pnum = 20;printf("%d", num);float f = 9.0;float* pf = &f;*pf = 5.0;printf("%d", f);
}
我们可以使用指针对指针指向的变量进行使用(修改或输出)。
1.2 指针与数组
- 数组名就是数组的首地址。
代码示例

- 得到数组首地址可以通过指针遍历数组
代码示例

二、指针数组✨
指针数组就是用来装指针的数组
int p1[]; //(方便理解拿整形数组对比)p1与[]结合说明p1是数组,装的是int类型的数据
int* p2[]; //[]优先级比*高 p2先与[]结合,说明p2是一个数组 里面装的是int*类型的数据
举个例子
#include <stdio.h>
int main()
{int a = 0;int b = 0;int c = 0;int* arr[3] = {&a,&b,&c}; //指针数组就是数组的每个位置都存储一个地址(指针)
}
三、数组指针🌞
3.1 数组指针的定义
数组指针与指针数组名字非常相似但是却截然不同,数组指针是一个指针,指针数组是一个数组
//对比一下指针数组和数组指针
int* pa[]; //这是指针数组,优先级问题,pa先与[]结合,说明pa是一个数组,装的是int*的数据
int (*pa)[] //这是数组指针,()优先级更高,pa先与*结合,说明pa是一个指针,指向一个int类型的数组
3.2 ”数组名“与”&数组名“
前面说了数组名代表数组首元素地址,那&数组名呢?
代码示例

- 对数组名与&数组名进行输出,发现地址一样

- 对数组名与&数组名+1,发现数组名加了四个字节,而&数组名加了十六进制的28,也就是十进制的40,为整个数组的大小。
结论:数组名与&数组名地址一样,但是数组名代表的是首元素地址,而&数组名代表的是整个数组。
3.3 数组指针使用
void print(int (*pa)[3])
{for(int i=0;i<2;i++){for(int j=0;j<3;j++){printf("%d",arr[i][j]);}}
}int main()
{int arr[2][3] = {0,1,2,3,4,5};print(arr); //二维数组首地址相当于 &(第一个一维数组)
}
四、函数指针🤓
函数指针就是指向函数的指针
-
函数指针的定义
-
- *函数返回值 (pa)(函数参数)
可以看作pa先与*结合,说明pa是个指针,指向一个函数
4.1函数指针的使用
代码示例
int add(int a,int b)
{return a+b;
}
int main()
{int (*pa)(int int) = add;int a = 3;int b = 4;printf("%d",pa(3,4)); //7
}
五、函数指针数组🚀
函数指针数组就是用来装函数指针的数组,需要注意每个函数指针数组的返回值和参数必须相同类型
-
函数指针数组的定义
-
- *函数返回值 (pa[])(函数参数)
可以看作pa先与[]结合说明pa是一个数组,每个位置装的是函数指针(地址)
5.1 函数指针数组的使用
#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;
}
void menu()
{printf("***************\n");printf(" 1:add 2:sub \n");printf(" 3:mul 4:div \n");printf(" 0:quit \n");printf("**************\n");
}
int main()
{int x = 0;int y = 0;int input = 0;int ret = 0;int(*p[5])(int x, int y) = { NULL, add, sub, mul, div };do{menu();printf("请选择:");scanf("%d", &input);if (input >= 1 && input <= 4){printf("输入两个数字:");scanf("%d %d", &x, &y);ret = (*p[input])(x, y);}else if (input == 0){break;}else{printf("请输入0-4的数字\n");continue;}printf("%d\n", ret);} while (input);
}

完结
创作不易,还请各位小伙伴多多点赞👍关注✨收藏⭐

相关文章:
【C语言】带你彻底理解指针(1)
✨✨✨✨如果文章对你有帮助记得点赞收藏关注哦!!✨✨✨✨ 文章目录指针的介绍:一、简单指针🌈1.1 指针的定义与使用1.2 指针与数组二、指针数组✨三、数组指针🌞3.1 数组指针的定义3.2 ”数组名“与”&数组名“3.…...
C/C++ 中 JSON 库的使用 (CJSON/nlohmann)
C/C 中 JSON 库的使用 (CJSON/nlohmann)概述cjson基本操作从(字符指针)缓冲区中解析出JSON结构转成成JS字符串(将传入的JSON结构转化为字符串)将JSON结构所占用的数据空间释放JSON 值的创建创建一个值类型的数据创建一个对象(文档)…...
【Opencv项目实战】目标检测:自动检测出现的所有动态目标
文章目录一、项目思路二、算法详解2.1、计算两个数组或数组与标量之间的每个元素的绝对差。2.2、轮廓检测 绘制物体轮廓 绘制矩阵轮廓2.3、连续窗口显示2.4、读取视频,显示视频,保存视频三、项目实战:实时动态目标检测实时动态目标检测一、…...
活动报名:Tapdata Cloud V3 最新功能全解与核心应用场景演示
作为中国的 “Fivetran/Airbyte”, Tapdata Cloud 自初版公测以来,已累积10,000 注册用户。核心场景包括 Any Source → Any Target 的实时数据库同步、数据入湖入仓,以及通用 ETL 处理等。近期,功能特性全面优化的 Tapdata Cloud V3 也已开放…...
人工智能AI威武,爱也……恨也……
人工智能AI威武,爱也!恨也!!它会创作会代码,从它那儿能仿到更好的思维;多它那里可以学到更好的代码。它聪慧全能,成为一坨人偷懒神器;变成“智者”作弊的“倚天屠龙”!&a…...
SpringBoot-基础篇
SpringBoot基础篇 在基础篇中,我给学习者的定位是先上手,能够使用SpringBoot搭建基于SpringBoot的web项目开发,所以内容设置较少,主要包含如下内容: SpringBoot快速入门SpringBoot基础配置基于SpringBoot整合SSMP…...
Tapdata Connector 实用指南:实时数仓场景之数据实时同步至 ClickHouse
【前言】作为中国的 “Fivetran/Airbyte”, Tapdata 是一个以低延迟数据移动为核心优势构建的现代数据平台,内置 60 数据连接器,拥有稳定的实时采集和传输能力、秒级响应的数据实时计算能力、稳定易用的数据实时服务能力,以及低代码可视化操作…...
刷题专练之数组移除元素
文章目录前言一、移除元素1.题目介绍2.思路:3.代码二、移动零1.题目介绍2.思路3.代码三、删除有序数组中的重复项1.题目介绍2.思想3.代码四、80. 删除有序数组中的重复项 II1.题目介绍2.思路3.代码4.推荐题解前言 我每个刷题篇的题目顺序都是特别安排的,…...
常见激活函数Activation Function的选择
Activation Function激活函数一般会神经网络中隐层和输出层上,其中作用在输出层主要用于适配输出,比如sigmoid函数可用于生成[0,1]之间的概率估计值。而作用于隐层主要用于增加神经网络的非线性,增加了网络的表达能力,本文主要介绍…...
大厂跟进ChatGPT,为什么百度“文心一言”成色最好?【快评】
作者 | 曾响铃 文 | 响铃说 赶ChatGPT热度,百度3月初就要发布与ChatGPT类似的人工智能聊天机器人服务“文心一言”(英文名:ERNIE Bot),似乎无法提振资本市场对百度的信心。 2022年第四季度及全年未经审计的财报发布…...
ChatGPT和Web3:人工智能如何帮助您建立和发展您的 Web3 公司
ChatGPT是OpenAI在2022年11月推出的聊天机器人。该机器人建立在OpenAI的GPT-3人工智能家族上,并通过监督学习和强化学习技术进行了优化。 与ChatGPT机器人聊天时,你会感觉自己在与一个懂得一切并以非常教育性的方式回答的朋友交谈。回答在许多知识领域非…...
【人工智能 AI】怎样实施RPA 机器人流程自动化(Robotic Process Automation)?核心技术有哪些?
文章目录 RPA 简介RPA的实施RPA的核心技术1. 自动化测试(1)自动化测试工具(2)自动化测试框架2. 自动化脚本(1)自动化脚本语言(2)自动化脚本框架3. 机器学习(1)机器学习模型(2)机器学习框架(3)自然语言处理(4)图像处理(5)深度学习(6)机器人操作系统RPA核心能…...
基于BP神经网络的性别识别,BP神经网络详细原理,自编码神经网络代码,神经网络案例之18
目标 背影 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数, BP神经网络的传递函数 数据 神经网络参数 基于BP神经网络 性别识别的MATLAB代码 效果图 结果分析 展望 背影 男人体内蛋白质比例大,女生…...
2023年消费电子行业研究报告
第一章 行业概况 消费电子行业是电子信息行业的子行业。消费电子是指围绕着消费者应用而设计的与生活、工作和娱乐息息相关的电子类产品,通常会应用于娱乐、通讯以及文书用途,最终实现消费者自由选择资讯、享受娱乐的目的,主要侧重于个人购买…...
CSDN 编程竞赛三十一期题解
竞赛总览 CSDN 编程竞赛三十一期:比赛详情 (csdn.net) 本次竞赛的最后一道题的描述部分有些问题(题目描述与样例不符),另外,测试数据似乎也有点问题,试了多种方式,但最多只能通过10%的测试点。…...
SpringMVC常见面试题(2023最新)
目录前言1.简单介绍下你对springMVC的理解?2.说一说SpringMVC的重要组件及其作用3.SpringMVC的工作原理或流程4.SpringMVC的优点5.SpringMVC常用注解6.SpringMVC和struts2的区别7.怎么实现SpringMVC拦截器8.SpringMvc的控制器是不是单例模式?如果是,有什…...
【正点原子FPGA连载】第十六章DP彩条显示实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南
1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第十六章DP彩条显…...
数据结构与算法—链表list
目录 链表 链表类型 链表插入 链表删除 写程序注意点 与数组区别 链表应用 LRU 实现思想 链表 链表,一种提高数据读取性能的技术,在硬件设计、软件开发中有广泛应用。常见CPU缓存,数据库缓存,浏览器缓存等。缓存满时&#…...
自定义View练习题目整理
一、动态音频播放柱形图 1、效果图: 2、步骤 (1)、新建自定义View类,继承View (2)、重写onDraw()方法,使用画笔和画布循环画一定数量的柱形 Overrideprotected void onDraw(Canvas canvas) {s…...
LAMP平台部署及应用
LAMP平台部署及应用 📒博客主页: 微笑的段嘉许博客主页 💻微信公众号:微笑的段嘉许 🎉欢迎关注🔎点赞👍收藏⭐留言📝 📌本文由微笑的段嘉许原创! Ὄ…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
