【指针详解】(上)看一遍就会❗❗❗家人们冲❗

这篇具有很好参考价值的文章主要介绍了【指针详解】(上)看一遍就会❗❗❗家人们冲❗。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

❤️ 铁汁们大家好,欢迎大家来到出小月的博客里, 🤗🤗🤗之前呢,我分享了C语言的小游戏“扫雷”。。。。今天呢,给大家分享指针篇,,希望大家看完我这篇文章都能够“涨芝士”,感觉小月写的还不错的话,记得👍🏻点赞加关注😘鼓励一下博主哦,不然下次可找不到我啦❗❗


作者简介

❤️ 作者的gitee:出小月;
❤️ 作者的主页:出小月的《程序员历险记》
❤️专栏:《C语言》,《数据结构初阶》
😊希望大家都能够:好好学习,天天编程❗❗❗



一、字符指针

🐻在指针的类型中我们知道有一种指针类型为字符指针 char* ;
字符指针是一个指针变量,它里面存放的就是一个字符的地址

例1️⃣

int main()
{
	char ch = 'w';
	char* pch;//定义一个字符指针pch
	pch = &ch;//指针pch里面存放的就是ch的地址
	printf("%c", *pch);//解引用
	return 0;
}

指针看完就会,C语言初阶,算法,数据结构
还有一种用法:

例2️⃣

int main()
{
	char arr[] = "abcdef";
	char* pc = arr;//数组名就是首元素的地址
	printf("%s", arr);
	return 0;
}

指针看完就会,C语言初阶,算法,数据结构
🐻注意:这里不是把整个字符串的地址放到指针变量pc中了,而是把字符串“abcdef”首字符的地址放到指针变量pc中。

例3️⃣

int main()
{
	char arr1[] = "chuxiaoyue";
	char arr2[] = "chuxiaoyue";
	char* pa1 = "chuxiaoyue";
	char* pa2 = "chuxiaoyue";
	if (arr1 == arr2) 
	{
		printf("arr1和arr2相同\n");
	}
	else
	{
		printf("arr1和arr2不同\n");
	}
	if (pa1 == pa2)
	{
		printf("pa1和pa2相同\n");
	}
	else
	{
		printf("pa1和pa2不同\n");
	}
	return 0;
}

指针看完就会,C语言初阶,算法,数据结构
🤗注意:这里的“chuxiaoyue”是一个常量字符串,当用相同的常量字符串去初始化不同的数组时,就会开辟出不同的内存块,因此arr1和arr2不同
c或c++会把常量字符串存储到单独的一个内存区域,当几个指针,同时指向一个字符串,实际上,它们指向的是相同的内存,因此pa1和pa2相同

二、指针数组

🤗好孩子是孩子,那指针数组是一个数组

int arr1[5]={0};//整形数组
char arr2[5]={0};//字符数组
int* arr3[5];//存放整形指针的数组=>指针数组
char* arr4[5];//存放字符指针的数组=>指针数组

int a=10;
int b=20;
int c=30;
int d=40;
int *arr[]={&a,&b,&c,&d};//arr[]就是一个指针数组,数组存放的就是地址;

例1️⃣

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

图解如下:⬇️
指针看完就会,C语言初阶,算法,数据结构
注意:* (*(arr+i)+j) 这里arr是一个数组名 就是arr[]这个数组首元素的地址,即arr1的地址,arr+1就是arr2的地址,因此 *(arr+0)就是arr1,而arr1是数组arr1[]首元素的地址,因此 *(arr+0)是数组arr1[]首元素的地址, *(arr+0)+1是数组arr1[]的第二个元素的地址,所以 *( *(arr+0)+1)就是数组arr1[]的第二个元素的值。

三、数组指针

🐻好孩子是孩子,数组指针是指针,数组指针就是指向数组的指针

例1️⃣

int ( * p)[10];
解释:p先和 * 结合,说明p是一个指针变量,然后指针指向的是一个大小为10个整型的数组。所以p是一个指针,指向一个数组,叫数组指针。
这里要注意:[]的优先级要高于号的,所以必须加上()来保证p先和结合。

例2️⃣

在int a[10]中,a是首元素的地址,而&a是数组的地址,那它们两个一样吗?显然不一样

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

	return 0;
}

指针看完就会,C语言初阶,算法,数据结构
实际上: &arr 表示的是数组的地址,而不是数组首元素的地址。
本例中 &arr 的类型是: int(*)[10] ,是一种数组指针类型
数组的地址+1,跳过整个数组的大小,所以 &arr+1 相对于 &arr 的差值是20.

例3️⃣

int main()
{
	int a[5] = { 1,2,3,4,5 };
	int(*p)[5] = &a;
	for (int i = 0; i < 5; i++)
	{
		printf("%d ",*(*p+i));//对p解引用就是数组名,数组名是首元素的地址
	}
	return 0;
}

例4️⃣

void print_arr2(int(*arr)[5], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf("%d ",*(*(arr+i)+j));
		}
		printf("\n");
	}
}
int main()
{
	int arr[3][5] = {{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}};
	print_arr2(arr, 3, 5);
	return 0;
}

对于二维数组,我们把它想成一维数组,那么二维数组的首元素就是第一行,所以arr就是指向第一行,int( * arr)[5],是一个数组指针,指向二维数组的第一行,y可以传参。 * ((arr+i)+j), arr+i是指向第i行的指针, * (arr+i)就是第i行的首元素的地址, * ( arr+i)+j就是第i行第j个元素的地址, * ((arr+i)+j)就是第i行第j个元素的值

总结

🤗🤗今天的分享就到这了,感觉小月写的还不错的话,记得点赞收藏一波啊,这只是指针的一部分哦,还有指针后面❗❗❗文章来源地址https://www.toymoban.com/news/detail-784526.html

到了这里,关于【指针详解】(上)看一遍就会❗❗❗家人们冲❗的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java反射,看完就会用

    在说反射概念之前,我们先说另外2个概念: 编译期 和 运行期 。 编译期: 编译期是源代码从文本形式转换为字节码的过程,这发生在Java代码被JVM执行之前。 在编译期,编译器对源代码进行语法检查、类型检查、变量名解析等操作,确保代码符合Java的语法规则,并将其编译

    2024年02月04日
    浏览(29)
  • Python 绘制热力图——看完就会用

    @使用Python绘制热力图——Pycharm python绘制热力图简单教程,复制代码就能用,需要表格可以留言~~~ 格式如下:(需要这个表的可以留言~在后续操作时仅需改变表格数据就行) 热力图所需的相关矩阵 然后就可以画出这样的图 其中关于\\\"cmap颜色\\\"通常指的是在数据可视化中使用

    2024年02月03日
    浏览(32)
  • RabbitMQ 使用教程(看完就会用了)

    RabbitMQ 是一种消息队列软件,可以用来实现分布式系统中的消息传递、异步任务处理、日志收集等功能。它基于 AMQP(Advanced Message Queuing Protocol)协议,支持多种编程语言和平台。 本文将介绍 RabbitMQ 的基本概念和使用方法,包括: RabbitMQ 的基本概念和架构 如何安装和配置

    2024年02月11日
    浏览(26)
  • 2023年最新CUDA安装教程,看完就会(windows版)。

    目录 前言 注意:本教程建立在您已经正确安装了显卡驱动的基础上 第一步,找到对应的CUDA版本 第二步,查看你要安装的pytorch版本对应的cuda版本(如果只需要安装cuda可以跳过) 第二步,下载cuda 第三步,安装CUDNN加速库 尾言 本文概述:正确安装CUDA是用显卡加速深度学习的

    2024年02月14日
    浏览(32)
  • Matlab实现ADF检验,adftest函数使用详细说明(看完就会用)

    ADF检验全称为Augmented Dickey-Fuller test。通常在使用时间序列模型(如ARMA,ARIMA)的时候用于检验时间序列数据的平稳性。他主要通过检验数据是否有单位根判断序列是否平稳。 输入参数: y:进行检验的时间序列 输出参数: h:检验结果 h = 0,说明序列不平稳; h = 1,说明序列

    2023年04月24日
    浏览(35)
  • 3.2.3 存储器与CPU的连接(重难点 看完就会)

    本节内容是存储器中的重点和难点,篇幅较长。并不用担忧,看完这片文章,你会对知识点十分了解,并且会用几道题目来巩固一下内容。 由于CPU所要执行的指令和数据都保存在主存当中,并且执行完成后,需要将执行结果保存回主存。二者之间的联系是非常频繁,所以他们

    2024年02月01日
    浏览(40)
  • C初阶必写的C语言小游戏—扫雷,一看就会,看完就能写

    人尽皆知的扫雷小游戏,原理简单,写法也简单,我会通过C语言分各个部分将这个小游戏进行剖析,一看就会! 我们需要新建一个头文件game.h,两个源文件game.c和text.c,一共三个文件 他们的关系是这样的: test.c是主体,是游戏的测试逻辑 game.c是游戏的实现逻辑 game.h是实现

    2024年02月05日
    浏览(32)
  • List 集合遍历过程中删除元素。这个坑踩一遍就不要再踩了!

    作为一名后端开发,不管采用什么语言 使用 List 集合的频率都非常高。 对 List 集合的遍历和遍历中操作数据也是家常便饭。 我从我使用的过程中对于此问题的思考与实践形成记录,与大家交流。有不对的地方,恳请大家指正。 List 集合的遍历有很多种方式,每一种遍历方式

    2024年02月12日
    浏览(33)
  • 看完就能懂!ElasticSearch-垃圾回收器优化

    当代主流虚拟机(Hotspot VM)的垃圾回收都采用“分代回收”的算法。“分代回收”是基于这样一个事实:对象的生命周期不同,所以针对不同生命周期的对象可以采取不同的回收方式,以便提高回收效率。 新生代:分三个区:一个Eden区,两个Survivor区,默认内存占比8:1:

    2024年04月15日
    浏览(22)
  • 扫雷游戏【敢看完就敢教会你】------- C语言

    目录 一、扫雷游戏介绍 二、实现游戏的前期工作 1.  游戏的原理逻辑 2.  初始化雷区 三、代码实现游戏 1.  实现 test.c 文件 2.  实现 Mine_Sweeper.c 文件 2.1  雷区初始化函数 2.2  埋地雷函数 2.3  展示雷区函数 2.4  排查地雷函数 2.4.1  排查地雷子函数 2.4.2  标记地雷子函数 2

    2024年02月15日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包