【C语言指针三】一维数组传参的本质、冒泡排序、二级指针、指针数组、指针数组模拟二维数组、字符指针变量

🎬 个人主页秦苒&
专栏传送门 :《C语言

🍀指尖燃热血,代码铸锋芒;以信仰破局,向顶峰生长


🎬秦苒&的简介:


前言:在【C语言指针二】从入门到通透:核心知识点全梳理(野指针,assert断言,指针的使用和传址调用,数组名的理解和使用指针反访问数组)中我们学习了数组是可以传递给函数,(知识点有疏漏的小伙伴可以点击学习一下)。接下来由我带大家认识一维数组传参的本质、冒泡排序、二级指针、指针数组、指针数组模拟二维数组、字符指针变量吧!!


文章目录


提示:以下是本篇文章正文内容,下面案例可供参考

一、一维数组传参的本质

接着我们来讨论⼀维数组传参的本质:

ok上素材

数组名是数组首元素的地址;那么在数组传参的时候,传递的是数组名,也就是说本质上数组传参传递的是数组首元素的地址

所以函数形参的部分理论上应该使用指针变量来接收受元素的地址在函数内部我们写sizeof(arr) 计算的是⼀个地址的大小(单位字节)而不是数组的大小(单位字节)。正是因为函数的参数部分是本质是指针,所以在函数内部是没办法求的数组元素个数的。

划重点-----
总的来说一维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。因为无论是数组形式还是指针形式,运行结果都是一样的,本质上传递的都是首元素地址!!

二、冒泡排序

冒泡排序是排序算法之一,他的兄弟还有插入排序,选择排序,快速排序,希尔排序,堆排序(后面我们都会具体讲解的,敬请期待)······而冒泡排序是最简单的,话不多说,快跟我一起拿下他吧!!

核心:两两相邻的元素进行比较

展示代码:

c 复制代码
#include<stdio.h>
void bubble_sort(int arr[], int sz)//参数接收数组元素个数
{
	int i = 0;
	//趟数
	for (i = 0; i < sz - 1; i++)
	{
		//一趟排序的过程
		int flag = 1;//假设这⼀趟已经有序了
		int j = 0;
		for (j = 0; j < sz - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				flag = 0;//发⽣交换就说明,⽆序
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
		if (flag == 1)//这⼀趟没交换就说明已经有序,后续⽆序排序了
			break;                                                                
	}
}
int main()
{
	int arr[] = { 3,1,7,5,8,9,0,2,4,6 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

其中有一个小小的知识点大家留意一下

三、二级指针

在讲二级指针之前我们先回顾一下一级指针,相信大家只要学会了一级指针,那二级指针肯定不在话下的啦!(主包感觉二者大差不差)

一级指针:

二级指针,咱们给他照猫画虎:

指针变量也是变量,是变量就有地址,那么是如何存放的呢?咱们继续看图!!

对于⼆级指针的运算有:

• *ppa 通过对ppa中的地址进行解引用,这样找到的是 pa , *ppa 其实访问的就是 pa .

• **ppa 先通过 *ppa 找到 pa ,然后对 pa 进行解引用操作: *pa ,那找到的是 a .

四、指针数组

指针数组是指针还是数组?

这里的学习我们继续照猫画虎!!

猫:整型数组--->存放整型的数组;字符数组--->存放字符的数组

虎:指针数组--->存放指针的数组

大家结合图片理解一下:

五、指针数组模拟二维数组

要求:打印3个数组中的内容

画图辅助理解:


parr[i]是访问parr数组的元素,parr[i]找到的数组元素指向了整型一维数组,parr[i][j]就是整型一维数组中的元素。

上述的代码模拟出二维数组的效果,实际上并非完全是⼆维数组,因为每一行并非是连续的。

六、字符指针变量

有⼀种指针类型为字符指针,表示为char*

一般是这样使用的:

c 复制代码
int main()
{
 char ch = 'w';
 char *pc = &ch;
 *pc = 'w';
 return 0;
}

在字符数组中,数组内容是可变的,

而在常量字符串的内容是不能修改的,否则会出错!!你要是问我为啥不能改,emmmm,人家就是这么规定的!!没有原因!!就像朱宝必须先经历期末周才能放寒假一个道理(愁)。

当然还有一种表示方法

上图中红色的句子咱们看图理解一下:

接下来咱们来练习一下

大家猜一下这段代码的运行结果:

c 复制代码
#include <stdio.h>
int main()
{
   char str1[] = "hello bit.";
   char str2[] = "hello bit.";
   const char *str3 = "hello bit.";
   const char *str4 = "hello bit.";
 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相同。


结尾

勇敢的寻宝者啊,这次旅途你挖掘到多少宝藏呢,苒苒很期待下次与您相遇!

结语:希望对寻找C语言相关内容的寻宝者有所帮助,不要忘记给博主"一键三连"哦!你的每一次鼓励都为我提供 了前行的动力!

小喵很期待与你再次寻宝奥 ᰔᩚ/•᷅•᷄\୭

相关推荐
【非典型Coder】3 小时前
JVM 垃圾收集器中的记忆集与读写屏障
java·开发语言·jvm
走错路的程序员3 小时前
C语言单片机与C#上位机之间传递大量参数比较好的实践方案
c语言·单片机·c#
代码游侠3 小时前
复习——Linux 系统编程
linux·运维·c语言·学习·算法
第二只羽毛3 小时前
外卖订餐管理系统
java·大数据·开发语言·算法
挫折常伴左右3 小时前
初学HTML2
java·开发语言
invicinble3 小时前
java--se数据处理
java·开发语言
昔时扬尘处3 小时前
如何检测python和pytest的安装环境
开发语言·python·pytest·自动化测试平台·adi
发疯幼稚鬼3 小时前
希尔排序与堆排序
c语言·数据结构·算法·排序算法
第二只羽毛3 小时前
图书管理系统项目PPT文稿
java·大数据·开发语言·ide