【C语言】带你彻底理解指针(1)

news2025/7/18 15:18:22

✨✨✨✨如果文章对你有帮助记得点赞收藏关注哦!!✨✨✨✨

文章目录

  • 指针的介绍:
  • 一、简单指针🌈
    • 1.1 指针的定义与使用
    • 1.2 指针与数组
  • 二、指针数组✨
  • 三、数组指针🌞
    • 3.1 数组指针的定义
    • 3.2 ”数组名“与”&数组名“
    • 3.3 数组指针使用
  • 四、函数指针🤓
    • 4.1函数指针的使用
  • 五、函数指针数组🚀
    • 5.1 函数指针数组的使用
    • 完结

指针的介绍:

  1. 指针是一个用来存放地址的变量,可以通过指针存放的地址找到对应位置的值,对其进行使用。
  2. 指针在32位平台下的大小是4个字节,在64位平台下是8个字节。(这是因为32位平台下内存地址是由32根地址线组成,一根地址线就是1bit,用4个字节就可以存下,而64位平台有64根地址线,需要八个字节才可以存下)。
  3. 如果对指针进行加减与解引用操作,则±的步长与解引用操作的长度由指针类型决定,指针类型是几个字节±步长与解引用就是几个字节。

一、简单指针🌈

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);	// b
    
    int num = 10;		
    int* pnum = &num;
    *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);
}

在这里插入图片描述


完结

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

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

达梦数据库DSC集群部署

一、概述 1.1 DSC 集群架构 1.2 架构说明 1、DMDSC 集群是一个多实例、单数据库的系统。 多个数据库实例可以同时访问、修改同一个数据库的数据。 2、数据文件、控制文件在集群系统中只有一份,不论有几个节点,这些节点都平等地使用这些文件, 这些文件保存在共享存储上。 3…

肠道核心菌属——双歧杆菌属,了解并拥有它

双歧杆菌 双歧杆菌属&#xff08;Bifidobacterium&#xff09;是放线菌门严格厌氧的革兰氏阳性多形性杆状细菌。末端常常分叉&#xff0c;故名双歧杆菌。是人和动物肠道的重要核心菌群和有益生理菌群&#xff0c;也是母乳喂养婴儿中发现的第二大菌。 肥胖、糖尿病和过敏等各种疾…

高德地图基础教程超详细版

在当前社会&#xff0c;对于地图的使用是很必须的&#xff0c;所以对于程序员来说也是需要掌握的技能&#xff0c;目前主流的又百度地图和高德地图&#xff0c;但是我建议使用高德地图&#xff0c;因为百度地图的API着实不好用吖&#xff0c;不好理解&#xff0c;对于开发人员来…

浏览器输入www.baidu.com后执行的全部过程

日升时奋斗&#xff0c;日落时自省 <1>URL输入 URL称为 : 统一资源定位符,用于定位互联网上的资源,也就是平常提起的"网址" 地址栏输入网址之后按下回车,浏览器会对输入的信息进行评判 (1)检查输入的内容是否是是一个合法的网址连接(非法地址不行) (2)合法的…

【spring教程】3.IoC容器概述

IoC 是 Inversion of Control 的简写&#xff0c;译为“控制反转”&#xff0c;它不是一门技术&#xff0c;而是一种设计思想&#xff0c;是一个重要的面向对象编程法则&#xff0c;能够指导我们如何设计出松耦合、更优良的程序。 Spring 通过 IoC 容器来管理所有 Java 对象的实…

【数据结构】二叉树的原理及实现

1.什么是数&#xff1f; 树这种数据结构在计算机中是非常重要的&#xff0c;是一种非线性数据结构。一些数据库的底层与快速索引都离不开树这种数据结构。树是有很多节点组成的具有一定层次关系的集合。最上面的可以看成是树的头&#xff0c;下面的很多节点就在这个头的基础上…

前端如何实现局部滚动效果?

一、基础版局部滚动 重点在于给需要滚动的区域加上 overflow: auto; 属性 废话不多说&#xff0c;先上基础版的局部滚动代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta http-equiv…

智能优化算法——遗传算法(GA)(纯理论,不包含代码)

今天接着PSO&#xff0c;记录一下遗传算法的实现原理。&#xff08;若有错误&#xff0c;请大佬帮忙指正&#xff01;&#xff09;&#xff08;同样&#xff0c;主要参考b站视频学习加入自己的一些理解&#xff0c;如果想要看视频学习&#xff0c;可以直接移步最后参考链接&…

深度学习引言

动手学深度学习pytorch版-笔记原文链接日常生活中的机器学习机器学习中的关键组件数据模型目标函数优化算法各种机器学习问题监督学习回归分类标记问题搜索推荐系统序列学习无监督学习与环境互动强化学习特点小结原文链接 动手学深度学习pytorch中文版 日常生活中的机器学习 …

可怕,chatGPT用3小时教会我数据分析

chatGPT这玩意真的是我的救星,用它作为我的Python教练,我用三个小时学会了数据处理(Pandas)和绘图(matplotlib)。 这两个库的学习,在之前已经困扰了我7个月。之前卡壳的原因,是我一直没有耐心从零开始,按照教材设置的教程去学习Python——我擅长在项目中学习,一点一点…

Android实现炫酷跳动的闪屏LOGO

前言&#xff1a;在日常开发中&#xff0c;经常会遇到各种视觉效果&#xff0c;有的效果可能一眼看去会让人觉得很复杂&#xff0c;但是我们必须明确一点&#xff1a;所有复杂动效都是可以分解成单一的基础动作&#xff0c;比如缩放&#xff0c;平移&#xff0c;旋转这些基础单…

最新BlackArch发布,提供1400款渗透测试工具

近日&#xff0c;BlackArch Linux新版本发布&#xff0c;此版本为白帽子和安全研究人员提供了大约1400款渗透测试工具&#xff0c;如果你是一位白帽子或者安全研究人员&#xff0c;这个消息无疑会让你很感兴趣。BlackArch Linux是一款基于Arch Linux的发行版&#xff0c;主要面…

luckysheet的使用——07.二次开发自动插入批注功能

在单元格编辑完成后&#xff0c;需要自动在这个单元格上新增批注&#xff0c;此时需要改造旧代码&#xff0c;首先找到路径为 src/controllers/postil.js的文件&#xff0c;找到新增批注时触发的方法&#xff0c;如下&#xff1a; 2.对方法进行改造&#xff0c;新增传入变量co…

深入探讨下,IPC产品与智能家居融合的无限开创性

IPC还有哪些新玩法&#xff1f;随着摄像头的应用场景增加&#xff0c;IPC作为一种能力&#xff0c;正在融入到越来越多的智能设备中&#xff0c;形成了一批富有创意的智能 IPC 融合类产品。 比如&#xff0c;扫地机结合智能 IPC 后&#xff0c;能实现可视化精准识别障碍物&…

C++实现日期类

文章目录前言1.日期类的功能分析1.大致分析2.接口设计2.具体实现1.日期类的成员函数和成员变量2.初始化(构造函数&#xff09;3.对日期进行天数推算4.比较相关的运算符重载5.前置后置自增或自减6.日期相减与流插入流提取1.日期相减2.重载流插入和流提取3.总结前言 之前介绍了C…

数据结构与算法—链表list

目录 链表 链表类型 链表插入 链表删除 写程序注意点 与数组区别 链表应用 LRU 实现思想 链表 链表&#xff0c;一种提高数据读取性能的技术&#xff0c;在硬件设计、软件开发中有广泛应用。常见CPU缓存&#xff0c;数据库缓存&#xff0c;浏览器缓存等。缓存满时&#…

mongoDB5以上实现单机事务

原理就是因为目前mongodb只有副本&#xff0c;分片支持事务。我们就让单机变成单节点副本&#xff0c;同时又是主节点&#xff0c;可以读写一、修改bin目录下的mongod.cfg新增配置replication:replSetName: rs0二、重启mongodb服务、初始化&#xff08;这是windows下的启动命令…

2月24日作业

题目&#xff1a;通过操作Cortex-A7核&#xff0c;串口输入相应的命令&#xff0c;控制LED灯进行工作--->上传CSDN 1.例如在串口输入led1on,开饭led1灯点亮 2.例如在串口输入led1off,开饭led1灯熄灭 3.例如在串口输入led2on,开饭led2灯点亮 4.例如在串口输入led2off,开饭led…

day20_Map

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、比较器排序 三、Collections 四、Map 五、HashMap 六、TreeMap 零、 复习昨日 HashSet 不允许重复元素,无序 HashSet去重原理: 先比较hashco…

Java知识复习(二)Java集合

1、List、Set和Map的区别 List&#xff1a;存储的顺序是有序的、可重复的Set&#xff1a;存储的顺序是无序的、不可重复的Map&#xff1a;使用键值对存储&#xff0c;Key和Value都是无序的&#xff0c;其中Key不可重复&#xff0c;而Value可重复 2、ArrayList和LinkedList的区…