考研C语言刷题基础篇之数组(一)

目录

第一题:用数组作为参数实现冒泡排序

不用函数的冒泡排序

冒泡排序原理:

错误的数值传参冒泡排序

错误的原因

就是什么是数组名

正确的数组传参的冒泡排序

数组的地址和数组首元素的地址的区别


第一题:用数组作为参数实现冒泡排序

不用函数的冒泡排序

冒泡排序原理:

一共经过n-1次排序:相邻之间两两作比较。交换位置

cpp 复制代码
//数组作为参数实现冒泡排序

int main()
{
	int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	for(int i=0;i<sz-1;i++)
	{
		for(int j=0;j<sz-1-i;j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;

			}
			
		}
	
	}
	for(int i=0;i<sz;i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;

}

错误的数值传参冒泡排序

我们将冒泡的实现封装成一个函数,这时我们发现出来,问题,打印的结果并没实现冒泡排序

cpp 复制代码
//错误的数组作为参数实现冒泡排序
void bubble_sort(int arr[])
{
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < sz - 1; i++)
	{
		for (int j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;

			}

		}

	}
}

int main()
{
	int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
	
	bubble_sort(arr);
	int i = 0;
	for(i=0;i<10;i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;

}

错误的原因

这是因为,有一个知识点需要补充。

就是什么是数组名

什么是数组名arr

  1. 数组名其实是地址,而且是首元素的地址
  2. 但是有两个特例不是首元素的地址
    1. sizeof(arr)这里不是首元素的地址,这里是整个数组的大小
    2. &arr,对数组取地址,这里不是对首元素取地址,这里是对数组取地址
  3. 除了这两个特例以外,其他的情况都是首元素的地址
  4. 数组是数组同样其实也是指针,因此可以用数组接收,也可以用指针接收

下面我们用的数组名arr传参,这里arr是首元素的地址。

cpp 复制代码
bubble_sort(arr);

参数传给

cpp 复制代码
void bubble_sort(int arr[])
//也可以用
void bubble_sort(int* arr)

被下面的调用,但是由于arr是首元素的地址,所以sizeof(arr)求出的是首元素的大学4字节,

sizeof(arr【0】)也是首元素的地址4字节。所以这是式子的结果为1;并非实际大小10.

cpp 复制代码
	int sz = sizeof(arr) / sizeof(arr[0]);

正确的数组传参的冒泡排序

cpp 复制代码
//正确的数组作为参数实现冒泡排序
void bubble_sort(int arr[],int sz)
{
	int i = 0;
	for (int i = 0; i < sz - 1; i++)
	{
		for (int j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;

			}

		}

	}
}

int main()
{
	int arr[] = { 10,9,8,7,6,5,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr,sz);
	int i = 0;
	for(i=0;i<10;i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;

}

数组的地址和数组首元素的地址的区别

虽然数组名在一些情况相当于数组首元的地址,但是这并不能代表数组的地址等于数组首元素的地址。

下面我们可以看出,数组名和数组首元素还有数组的地址的地址是一样的。

而当我们对数组的地址和数组首元素的地址+1之后,就会发现他们并不一样。

我们发现数组名+1,和数组首元素+1,相当于地址加了4,这是应为他们加一相当于跳过了一位元素,四个字节。

而数组的地址加一,相当于整个数组10个元素都+1,那么就加了40个字节的地址。

相关推荐
superman超哥3 小时前
Rust 异步并发核心:tokio::spawn 与任务派发机制深度解析
开发语言·rust·编程语言·rust异步并发核心·rust任务派发机制
喵星人工作室3 小时前
C++传说:神明之剑0.2.1
开发语言·c++·游戏
黎雁·泠崖3 小时前
Java入门之吃透基础语法:注释+关键字+字面量+变量全解析
java·开发语言·intellij-idea·intellij idea
Ashley_Amanda3 小时前
Python 常见问题梳理
开发语言·windows·python
UpgradeLink3 小时前
基于 Go 打造的升级链路管理平台:upgradelink 让设备升级更简单
开发语言·后端·golang
天府之绝3 小时前
uniapp 中使用uview表单验证时,自定义扩展的表单,在改变时无法触发表单验证处理;
开发语言·前端·javascript·vue.js·uni-app
萧鼎4 小时前
深入解析 Python 的 Word 模板引擎:docxtpl 全面指南
开发语言·python·word
Chan164 小时前
场景题:如何设计一个分布式ID
java·开发语言·spring boot·java-ee·intellij-idea
松涛和鸣4 小时前
51、51单片机
c语言·网络·单片机·嵌入式硬件·tcp/ip·51单片机
chamu994 小时前
C++ 的可调用对象
开发语言·c++