【C语言】指针进化 !!!

这篇具有很好参考价值的文章主要介绍了【C语言】指针进化 !!!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言
🎈大家好,我是何小侠🎈
🍃大家可以叫我小何或者小侠🍃
💐希望能通过写博客加深自己对于学习内容的理解💐
🌸也能帮助更多人理解和学习🌸

兰生幽谷,不为莫服而不芳。舟在江海,不为莫乘而不浮。君子行义,不为莫知而止休。— 出自《淮南子·说山训》

解释:兰花生长在无人的山谷,不会因为没人佩戴而不散发芳香;船在江河湖海上,不会因为没有人乘坐而不浮在水上;君子行使自己的道义,不因没有人理解而停止。

【C语言】指针进化 !!!,C语言,c语言,经验分享,笔记


    这篇博客我们将会深入的理解指针和学习指针的用法。
    【C语言】指针进化 !!!,C语言,c语言,经验分享,笔记

    字符指针⁉️

    1. 字符指针最基本的用法如下。
    int main()
    {
    	char ch = 'w';
    	char* p = &ch;
    	*p = 'a';
    
    	return 0;
    }
    

    这确实是一个本基本的代码我们都会使用。
    我们看看在内存中是怎么变化的。
    【C语言】指针进化 !!!,C语言,c语言,经验分享,笔记

    首先将’ w ‘的对应的ASCII值存在ch中,然后用 p这个指针变量存放ch的地址,通过给解引用p赋值,成功改变ch中的字符由’ w ‘变成’ a ’
    【C语言】指针进化 !!!,C语言,c语言,经验分享,笔记
    当然这都是16进制的表示方法,自己算一算便可知道。

    1. 字符指针的第二种用法。
    int main()
    {
    	char* p = "abcdefg";
    	printf(p);
    	printf("\n%c", *p);
    	return 0;
    }
    

    我们看第一行代码时要注意,这里是将一个常量字符串"abcdefg"的首地址放在了p中,我们通过这个首地址找到这个常量字符串。并不是把这个字符串放在p里面。
    那么打印的结果就应该是 :
    abcdefg
    a
    【C语言】指针进化 !!!,C语言,c语言,经验分享,笔记
    没错确实是这样。
    那我们是否能够改变*p的内容呢?

    int main()
    {
    	char* p = "abcdefg";
    	printf(p);
    	printf("\n%c", *p);
    	*p = 'w';
    	printf("\n%c", *p);
    
    	return 0;
    }
    

    其实 * p = ‘w’;这种写法是不对的,为什么呢?因为我们的"abcdefg"是一个常量字符串常量字符串是不能够修改的!!

    指针数组🐽

    我们都知道,整型数组是存放整型的数组,字符数组是存放字符的数组
    那么指针数组就比较明显,肯定是存放指针的数组。

    1. 那么它的一般形式是什么呢?
    int main()
    {
    	char* pc = "abcde";
    	char* p1 = pc;
    	char* p2 = pc+1;
    	char* p3 = pc + 2;
    	char* p4 = pc + 3;
    	char* p5 = pc + 4;
    	char* p[5] = { p1,p2,p3,p4,p5 };
    	for (int i = 0; i < 5; i++)
    	{
    		printf("%c\n", *p[i]);//[]先结合,因为优先级最高。
    	}
    	return 0;
    }
    

    我们为了与上面的字符指针对应,例子举的相似一点。
    我们知道p1 ~ p5 存储的就是对应的abcde的地址,而类型决定应该放什么元素,而这里指针数组是字符指针数组,所以类型就是char *.
    我们想一下,在我们传参的时候,arr数组名就是用char * 来接受的,为什么呢?就是因为实参就是地址,char * 类型也就是需要地址来作为数组元素,那么这里的初始化就应该很好理解了。

    【C语言】指针进化 !!!,C语言,c语言,经验分享,笔记

    1. 但是我们一般会这样来使用它
    int main()
    {
    	int arr1[] = { 1,2,3,4,5 };
    	int arr2[] = { 2,3,4,5,6 };
    	int arr3[] = { 3,4,5,6,7 };
    
    	int* p[3] = { arr1,arr2,arr3 };
    	int i = 0;
    	int j = 0;
    	for (i = 0; i < 3; i++)
    	{
    		for (j = 0; j < 5; j++)
    		{
    			printf("%d", *(*(p + i) + j));
    		}
    		printf("\n");
    	}
    	return 0;
    }
    

    【C语言】指针进化 !!!,C语言,c语言,经验分享,笔记

    我们这里要讲的是最后的输出部分

    	printf("%d", *(*(p + i) + j));
    
    

    这里为什么要这样写呢?还有没有其他写法?
    我们知道arr[3] = *(arr +3); 为什么呢? arr[3]其实是下标为3的元素,那么
    arr+3就是下标为3的元素的地址,我解引用不就是这个元素吗?
    这里也差不多。
    【C语言】指针进化 !!!,C语言,c语言,经验分享,笔记
    我们可以这样理解,先看成是一个一维数组,那么*(p+i)不就是拿到arr1,或者arr2,arr3的地址吗?加入我们拿到arr1的地址。
    【C语言】指针进化 !!!,C语言,c语言,经验分享,笔记
    那么*(p )就是arr1这个数组的首地址, * (arr1+j)也就很明显了。
    那么我们换一种写法呢?
    这样写:*( p[ i ]+j )
    【C语言】指针进化 !!!,C语言,c语言,经验分享,笔记

    这样写:p[ i ][ j ]
    【C语言】指针进化 !!!,C语言,c语言,经验分享,笔记
    为什么可以当作二维数组看呢?因为二维数组其实也可以理解为多个一维数组的拼接。但是我觉得还是我上面描述的要更清晰一些。

    这样写: (*(p + i))[ j]
    【C语言】指针进化 !!!,C语言,c语言,经验分享,笔记

    数组指针🦑

    我们上面讲的是指针数组,是数组。因为最后是数组这个名词,而数组指针是指针,是指向数组的指针。

    1. 区分指针数组和数组指针
    int *p1[10];
    int (*p2)[10];
    //p1, p2分别是什么?
    

    p1是指针数组,为什么呢?我们讲过,p1先与[ ]结合确认是一个数组,再与结合说明是指针数组。
    而p2就是我们要讲到的数组指针,用()让
    p2 优先结合说明是一个指针,然后确认指针类型,是int [ 10 ],也就是数组指针

    &数组名与数组名的区别

    这真的是一个非常重要的知识点。
    我们先来看一段代码

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

    【C语言】指针进化 !!!,C语言,c语言,经验分享,笔记
    我们用计算机一算便知。
    【C语言】指针进化 !!!,C语言,c语言,经验分享,笔记
    这里为什么是这样呢?

    • 实际上&arr,取出的是整个数组的地址,整个数组的地址+1也就应该跳过一个数组。
    • arr是首元素地址,+1当然只会跳过一个元素。
      大家觉得这和我们的指针是不是有点类似呢?
      我们知道 arr传参我们可以用 int * arr这个指指来接受,这个我们已经是老生常谈了,上面也解释过了。
      那么&arr用什么来接收?
      当然用数组指针
      整型指针变量存储的是一个整型元素的地址!
      那么数组指针变量应该存储的是数组的首元素地址,由于类型是数组指针,+1当然就会跳过一个数组的大小。

    那么我们就可以得出结论,&arr的数组名就是 int (*p)[ ]。

    数组指针的用法

    int main()
    {
        int arr[10] = {1,2,3,4,5,6,7,8,9,0};
        int (*p)[10] = &arr;//把数组arr的地址赋值给数组指针变量p
        //但是我们一般很少这样写代码
        return 0;
    }
    

    我们一般这么写。

    void print(int(*p)[5],int i ,int j )
    {
    	for (i = 0; i < 3; i++)
    	{
    		for (j = 0; j < 5; j++)
    		{
    			printf("%d ",(*(p+i))[j]);//不要写成 *p+i,
    			//因为*比加号的优先级要高
    			//printf("%d ", *(*(p + i) + j));
    	  }
    		printf("\n");
    	}
    
    
    }
    
    int main()
    {
    	int arr[][5] = { {1 ,3 ,4} ,{2,3,4,5,6}, {1,2,3,4} };
    	print(arr,3,5);
    	return 0;
    }
    

    可能有点跳跃不过没有关系,为什么二维数组传首地址能够用数组指针接收呢?
    我们知道二维数组的数组名代表第一行的地址,第一行就相当于是一个一维数组,所以说可以。

    学了指针数组和数组指针我们来一起回顾并看看下面代码的意思 :

    int arr[5];
    int *parr1[10];
    int (*parr2)[10];
    int (*parr3[10])[5];
    
    1. 是一个普通的整型数组,5个元素,每个元素是int
    2. 是一个指针数组,存放的是整型指针,每个元素是int *
    3. 是一个数组指针,指向的是整型数组,数组每个元素是int
    4. 是一个指针数组,指针的类型是数组指针,也就是说是一个存放指向数组的指针的数组【C语言】指针进化 !!!,C语言,c语言,经验分享,笔记

    总结🍊

    这篇博客值得我们学习了指针进化的第一部分,后续还有几部分我也会陆续发出来,请大家期待。

    最后如果这篇博客有帮助到你,欢迎点赞关注加收藏

    【C语言】指针进化 !!!,C语言,c语言,经验分享,笔记【C语言】指针进化 !!!,C语言,c语言,经验分享,笔记
    如果本文有任何错误或者有疑点欢迎在评论区评论
    【C语言】指针进化 !!!,C语言,c语言,经验分享,笔记

    【C语言】指针进化 !!!,C语言,c语言,经验分享,笔记文章来源地址https://www.toymoban.com/news/detail-539985.html

    到了这里,关于【C语言】指针进化 !!!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

    相关文章

    • 【经验分享】自然语言处理技术有哪些局限性和挑战?

      个人认为,主要是两个难点: 1.语料,通常的语料很好解决,用爬虫从互联网上就可以采集和标注训练。但是我们接触很多项目和客户需求都是专业性很强的,例如:航天材料、电气设备、地理信息、化学试剂 等等。往往很多素材和语料都是很宝贵的,而且都是这些企业的内

      2024年02月21日
      浏览(47)
    • [word] word如何设置每行字符数 #笔记#经验分享#媒体

      word如何设置每行字符数 如何设置每行字符数? 设置WORD设定每行中的字符数和每页中的行数的具体步骤如下: 我们需要准备的材料分别是:电脑、word文档。 1、首先我们打开需要编辑的word文档,点击打开“页面布局”。 2、然后我们在弹出来的子菜单栏中点击打开页面设置

      2024年02月22日
      浏览(42)
    • C语言K&R圣经笔记 5.6指针数组;指针的指针

      因为指针本身也是变量,所以它们也能像其他变量一样保存在数组里面。我们写个程序来说明,该程序将一些文本行按照字母顺序排列,算是 UNIX 程序 sort 的精简版本。 在第三章中,我们介绍了对一个整数数组进行排序的 Shell 排序函数,而在第四章中,我们用快速排序对其

      2024年02月03日
      浏览(46)
    • 经验模态分解和各种进化及变种 EMD,EEMD,CEEMD,CEEMDAN,ESMD等简要介绍

      EMD是时频分析常用的一种信号处理方式,EMD经过发展到现在也有很多不同的发展,本文总结了已知的各种优化和变种。 EMD(经验模态分解):基本模态分解 EEMD(集合经验模态分解):EMD+白噪声 CEEMD(互补集合经验模态分解):加正负成对的辅助白噪声 CEEMDAN(完全自适应噪声集合经验

      2024年02月03日
      浏览(43)
    • 【C语言】指针知识点笔记(2)

      目录 一、野指针 二、assert断言 三、指针的使用和传址调用 四、数组名的理解 五、使用指针访问数组

      2024年01月18日
      浏览(43)
    • C/C++|物联网开发入门+项目实战|指针|嵌入式C语言高级|C语言内存空间的使用-学习笔记(9)

      参考: 麦子学院-嵌入式C语言高级-内存空间 内存类型资源地址、门牌号的代名词 指针:地址的代名词 指针变量:存放指针这个概念的盒子 *P char *p *p; C语言娟译器对指针这个特殊的概念,有2个疑问? 1、分配一个盒子,盒子要多大? 在32bit系统中,指针就4个字节 2、盘子里存放

      2023年04月22日
      浏览(70)
    • 前端进化笔记-JavaScript(三)

      人类在白色的底色上描绘图画,地球在黑色的底色上创造生命。 JavaScript的变量可以说是独树一帜。只需要一个(或两个等)(const,let)就可以创建变量,创建时不考虑变量的类型,这是其他语言少有的强大功能。当然强大的功能总是伴随着问题。 原始值:Undefined,

      2024年02月08日
      浏览(82)
    • 【CSDN快速获得铁粉小经验】厉昱辰的经验分享

       如何快速的涨粉呢?今天将带领大家一起涨粉喽🥰🥰🥳🥳 官方算法进行最低阅读量过滤,阅读量太低的直接不参与热榜计算,刚创建的文章应该在其他渠道有一些冷启动的过程。但是阅读量是一个容易被刷的数据,该数据并不参与后续计算。所以新写的文章要快速上热榜

      2024年02月06日
      浏览(41)
    • 【R语言】R包-探索ggtree进化树美化

      提示:基于nwk文件进行进化树美化,如更换进化树格式,添加分组、节点、遗传距离等 官网ggtree.html 基于该包,设置好参数,可以批量优化,比在线网站方便的多,但绘制无根树,一直报错,待探索完分享大家 参考来源 1. 详细说明及示例数据参考:4 Phylogenetic Tree Visualizat

      2024年03月11日
      浏览(48)
    • 大数据面试经验分享

      一、简历部分 ​ 首先,无论什么样的简历应当包含核心四个部分,分别为基本信息、技术栈、工作经历、项目经历。 1、基本信息: ​ 姓名、性别、年龄、联系方式、学历信息。例:张三、男、25、123123、本科 2、技术栈: ​ 编程语言(java、python、scala),数据库(mysql、

      2023年04月16日
      浏览(58)

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

    支付宝扫一扫打赏

    博客赞助

    微信扫一扫打赏

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

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

    二维码1

    领取红包

    二维码2

    领红包