指针的进阶【上篇】

news2025/8/2 10:41:22

文章目录

  • 📀1.字符指针
  • 📀2.指针数组
  • 📀3.数组指针
    • 💿3.1.数组指针的定义
    • 💿3.2. &数组名VS数组名
    • 💿3.3.数组指针的使用

在这里插入图片描述

📀1.字符指针

int main()
{
	char ch = 'w';
	char* pc = &ch;// pc就是字符指针

	char* p = "abcdef";// 把字符串首元素地址放在p中
	*p = 'w';

	return 0;
} 

👉表达式的值是首元素的地址
👉但是这段代码运行起来会崩掉,调试看一下👇
在这里插入图片描述
👉因为这里的 “abcdef” 是常量字符串,不能被修改

int main()
{
	char arr[] = "abcdef";
	char* p = arr; // p指向的是arr数组首元素地址,arr数组是可以修改的
	*p = 'w';
	printf("%s\n", arr);// wbcdef

	return 0;
} 

在这里插入图片描述
这里就可以很好的运行,因为p指向的是arr数组首元素地址,arr数组是可以修改的

👉字符指针不仅仅可以指向字符,还可以指向字符串,但其实指向的还是字符串首字符,但是可以顺藤摸瓜找到整个字符串的字符,指向数组也是一样的

💡看一道例题👇

int main()
{
	char str1[] = "hello programming.";
	char str2[] = "hello programming.";

	const char* str3 = "hello programming.";
	const char* str4 = "hello programming.";

	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;
}

输出的两个结果分别是什么呢?
在这里插入图片描述

🔔这里str3和str4指向的是同一个常量字符串。C/C++会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4相同。

📀2.指针数组

👉类比一下:

字符数组 ---- 存放字符的数组
char arr1[10];
整型数组 ---- 存放整型的数组
int arr2[5];
指针数组 ---- 存放的就是指针
eg:存放字符指针的数组 ---- 字符指针数组
char* arr3[5];
eg:存放整型指针的数组 ---- 整形指针数组
int* arr4[6];

举个栗子🌰:
eg1:👇

int main()
{
	char* arr[] = { "abcdef","hehehe","666" };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		printf("%s\n", arr[i]);
	}

	return 0;
}

在这里插入图片描述
eg2:👇
一维数组模拟一个二维数组

int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 2,3,4,5,6 };
	int arr3[] = { 3,4,5,6,7 };
	//arr是一个存放整型指针的数组
	int* arr[] = { arr1,arr2,arr3 };
	int i = 0;
	for (i = 0; i < 3; i++) //行
	{
		int j = 0;
		for (j = 0; j < 5; j++) //列
		{
			printf("%d ", *(arr[i] + j));
		//  printf("%d ", arr[i][j]);
		}
		printf("\n");
	}

	return 0;
}

在这里插入图片描述

📀3.数组指针

💿3.1.数组指针的定义

👉类比一下:

整型指针 ---- 指向整型的指针
int a = 10;
int* p = &a;
字符指针 ---- 指向字符的指针
char ch = ’w‘;
char* pc = &ch;
数组指针 ---- 指向数组的指针 ---- 存放的是数组的地址
int arr[10];
int ( * pa)[10] = &arr; 取出的是数组的地址
char arr[10];
char ( * pc)[10] = &arr;
int* arr[5];
int * (*p)[5] = &arr;

💿3.2. &数组名VS数组名

💡数组名绝大部分情况下是数组首元素的地址
💡有两个例外:

1. sizeof (数组名)------ sizeof 内部单独放一个数组名的时候,数组名表示的是整个数组,计算得到的是数组的总大小
2. &arr ------ 这里的数组名表示整个数组,取出的是整个数组的地址,从地址值的的角度来讲,和数组首元素的地址是一样的,但是意义不一样

int main()
{
	int arr[10] = { 0 };
	printf("%p\n", sizeof(arr));
	
	printf("%p\n", arr);
	printf("%p\n", &arr[0]);
	printf("%p\n", &arr);

	return 0;

在这里插入图片描述
在看一下这段代码及解析👇

int main()
{
	int arr[10] = { 0 };
	//printf("%p\n", sizeof(arr));
	printf("%p\n", arr);//int*
	printf("%p\n", arr+1);//4

	printf("%p\n", &arr[0]);//int*
	printf("%p\n", &arr[0]+1);//4

	printf("%p\n", &arr);//int(*)[10]
	printf("%p\n", &arr+1);//40
	int(*p)[10] = &arr;//p是一个数组指针
   //int(*)[10]

	return 0;
}

在这里插入图片描述

👉根据第一段代码我们发现,其实 &arr 和 arr,虽然值是一样的,但是意义应该不一样的
👉实际上: &arr 表示的是数组的地址,而不是数组首元素的地址(细品)
👉第二段代码中 &arr 的类型是:int (*)[10],是一种数组指针类型,数组指针的地址+1,跳过整个数组大小, 所以&arr+1 相对于&arr 的差值是40

💿3.3.数组指针的使用

我们直接上代码和注释(请细品🍔)👇

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	//使用指针来访问
	//int* p = arr;

	//for (i = 0; i < sz; i++)
	//{
	//	printf("%d ", *(p + i));
	//}

	int(*p)[10] = &arr;
	//p ---- &arr
	//*p ---- *&arr
	//*p ---- arr
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *((*p) + i));
	}

	return 0;
}

在这里插入图片描述

//一维数组传参,形参是数组
void print(int arr[10], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
//一维数组传参,形参是指针
void print(int *arr, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		//printf("%d ", arr[i]);
		printf("%d ", *(arr+i));
	}
	printf("\n");
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	print(arr, sz);

	return 0;
}

在这里插入图片描述

void print(int arr[3][5], int r, int c)
{
	int i = 0;
	for (i = 0; i < r; i++)
	{
		int j = 0;
		for (j = 0; j < c; j++)
		{
			printf("%d ",arr[i][j]);
		}
		printf("\n");
	}
}

void print(int(*arr)[5], int r, int c)
{
	int i = 0;
	for (i = 0; i < r; i++)
	{
		int j = 0;
		for (j = 0; j < c; j++)
		{
			printf("%d ", *(*(arr + i) + j));//arr[i]
		}
		printf("\n");
	}
}
int main()
{
	int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
	//二维数组的数组名,也表示首元素地址
	//二维数组的首元素是第一行
	//首元素的地址就是第一行的地址,是一个一维数组的地址
	print(arr, 3, 5);


	return 0;
}

在这里插入图片描述

🥰希望大家能够理解呀🥰

总结🥰
以上就是 指针的进阶【上篇】 内容啦🥳🥳🥳🥳
本文章所在【C语言知识篇】专栏,感兴趣的烙铁可以订阅本专栏哦🥳🥳🥳
欲知后事如何,请听下篇分解喽💕💕💕
小的会继续学习,继续努力带来更好的作品😊😊😊
创作写文不易,还多请各位大佬uu们多多支持哦🥰🥰🥰

请添加图片描述

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

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

相关文章

数据结构之顺序表篇

一、顺序表概念 二、顺序表各类接口实现 *顺序表初始化 **顺序表销毁 ***顺序表插入操作 ****顺序表删除操作 *****顺序表查找操作 ******顺序表实现打印操作 三、顺序表整体实现源码 *SeqList.h **SeqList.c ***test.c 一、顺序表概念 讲顺序表之前先引入线性表概念&#xff…

可视化服务编排在金融APP中的实践

本文重点介绍了京东金融APP在BFF层实践过程中遇到的问题&#xff0c;并引出可视化服务编排在金融APP中的落地实践&#xff0c;其中重点介绍了可视化服务编排系统的核心功能及实现。 可视化服务编排系统已经稳定支持了金融APP从去年618到现在的所有发版迭代&#xff0c;对人效提…

Apache ActiveMQ安装和使用

文章目录Apache ActiveMQ安装和使用 环境下载安装配置启动登录Apache ActiveMQ安装和使用 环境 Ubuntu20.04 下载 官网&#xff1a;https://activemq.apache.org/download-archives 如下载5.14.4版本&#xff0c;apache-activemq-5.14.4-bin.tar.gz&#xff0c;测试过没问题…

分布式算法 - 一致性Hash算法

一致性Hash算法是个经典算法&#xff0c;Hash环的引入是为解决单调性(Monotonicity) 的问题&#xff1b;虚拟节点的引入是为了解决 平衡性(Balance) 问题。一致性Hash算法引入在分布式集群中&#xff0c;对机器的添加删除&#xff0c;或者机器故障后自动脱离集群这些操作是分布…

MySQL索引类型及原理?一文读懂

一、什么是MySQL索引&#xff1f; MySQL索引是一种数据结构&#xff0c;用于提高数据库查询的性能。它类似于一本书的目录&#xff0c;通过在表中存储指向数据行的引用&#xff0c;使得查询数据的速度更快。 在MySQL中&#xff0c;索引通常是在表上定义的&#xff0c;它们可以…

本地新创建的项目,关联/上传到码云

以下示例以mac为例&#xff0c;window将相关步骤改为windows对应的操作即可1、打开终端&#xff0c;通过终端命令 cd 切换到新建的本地项目目录下&#xff0c;如&#xff1a;&#xff08;/Users/wangcongming/Documents/TuoTuo/mobile_acitvity 为我的新建项目地址&#xff09;…

使用 ChatGPT ,通过自然语言编写 eBPF 程序和追踪 Linux 系统

eBPF 是一项革命性的技术&#xff0c;起源于 Linux 内核&#xff0c;可以在操作系统的内核中运行沙盒程序。它被用来安全和有效地扩展内核的功能&#xff0c;而不需要改变内核的源代码或加载内核模块。今天&#xff0c;eBPF被广泛用于各类场景&#xff1a;在现代数据中心和云原…

「RISC-V Arch」SBI 规范解读

术语 SBI&#xff0c;Supervisor Binary Interface&#xff0c;管理二进制接口 U-Mode&#xff0c;User mode&#xff0c;用户模式 S-Mode&#xff0c;Supervisor mode&#xff0c;监督模式 VS-Mode&#xff0c;Virtualization Supervisor mode&#xff0c;虚拟机监督模式 …

嵌入式 Linux Shell编程

目录 1、shell脚本 2、执行shell脚本 3、shell脚本编写 3.1 shell变量 3.2 标准变量或环境变量 3.4 变量赋值有五种格式 3.5 运算符和表达式 关系运算符 布尔运算符 3.6 Test命令用法 1、判断表达式 2、判断字符串 3.判断整数 4、判断文件 3.7 数组 1、数组定义…

什么是 RPA ?What is robotic process automation (RPA)?

目录 前言 What is a business process? 什么是业务流程? What does "robotic process automation" mean?“机器人过程自动化”是什么意思? What is robotic process automation (RPA)?什么是机器人流程自动化 (RPA)? What

SGI 空间配置器

前言 空间配置器是 STL 六大组件之一&#xff0c;它总是隐藏在容器的背后&#xff0c;默默工作&#xff0c;默默付出。本文为《STL 源码剖析》读书笔记&#xff0c;主要讨论 SGI 版本空间的配置和释放&#xff0c;对代码进行解读时会改变一些写法&#xff0c;使其更易于阅读。…

__stack_chk_fail问题分析

一、问题进程收到SIGABRT信号异常退出&#xff0c;异常调用栈显示__stack_chk_fail*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** Build fingerprint: Pico/A7H10/PICOA7H10:10/5.5.0/smartcm.1676912090:userdebug/dev-keys Revision: 0 ABI: arm64 Times…

VS Code下载安装教程

VS Code下载安装使用教程 目录VS Code下载安装使用教程一、下载二、安装三、使用教程3.1 VS Code中的第一个页面HelloWorld.html3.2 VS Code插件安装3.2.1 安装中文界面3.2.3 安装 Open in Browser插件3.2.4 安装Auto Rename Tag插件注意&#xff1a;3.3 code .命令&#xff0c…

EasyNLP集成K-Global Pointer算法,支持中文信息抽取

作者&#xff1a;周纪咏、汪诚愚、严俊冰、黄俊 导读 信息抽取的三大任务是命名实体识别、关系抽取、事件抽取。命名实体识别是指识别文本中具有特定意义的实体&#xff0c;包括人名、地名、机构名、专有名词等&#xff1b;关系抽取是指识别文本中实体之间的关系&#xff1b;…

代码随想录算法训练营第十天 | 理论基础、232.用栈实现队列、225. 用队列实现栈

打卡第10天&#xff0c;今天学习栈和队列 今日任务 理论基础232.用栈实现队列 用队列实现栈 理论基础 栈&#xff1a;先进后出 队列&#xff1a;先进先出 栈和队列是STL&#xff08;C标准库&#xff09;里面的两个数据结构 在 SGI STL 中&#xff0c;栈和队列的底层实现 栈…

Android使用FrameLayout+RecyclerView实现悬浮置顶封装功能

一、实际开发效果图默认效果:滚动后的效果:二、效果实现方式CoordinatorLayout AppBarLayout RecyclerView(适用于简单的悬浮View不超过一屏的情况&#xff0c;头部固定&#xff0c;数据简单)FrameLayout RecyclerView(适用于复杂的多条目布局&#xff0c;且悬浮条目位置受后…

移动硬盘无法识别?恢复硬盘,问题已解决

移动硬盘和U盘比较&#xff0c;它的体积是比较大的&#xff0c;但是相应的存储位置就会大点。它作为可移动设备&#xff0c;对于存储大型的数据&#xff0c;还是非常方便的。 有时候用户会发现移动硬盘出现一些问题&#xff0c;移动硬盘与电脑连接后&#xff0c;在电脑桌面右下…

java自定义注解实现数据字典映射

一 &#xff1a;前言 在我们开发过程中&#xff0c;我们从前端页面接收的数据字典一般都是key&#xff08;大多数为数字&#xff09;&#xff0c;但我们在页面显示的时候&#xff0c;想用其value值。如果我们每使用一次就要去写一些重复的代码去查询&#xff0c;这样会使我们的…

SharePoint Online CDN简介

前言 可能很多人并不了解CDN这个概念&#xff0c;不过作为Web从业人员着实不该&#xff0c;CDN就是内容分发网络&#xff0c;说白了就是第三方帮你托管静态资源&#xff0c;你可以在全球任何位置快速访问到对应的节点的资源。 正文 我们提到的SharePoint CDN&#xff0c;其实更…

高精度加减乘除

高精度加法 对于给定的两个特别大的数我们用两个字符串来接收 s1和s2。 例如&#xff1a;对于两个数 56215455和95425453&#xff0c;即 s1 "56215455" &#xff0c; s2 "95425453"。 对于这两个数&#xff0c;分别用两个列表 a和b来接收(例如&#x…