代码编织梦想

一维数组

一维数组的创建

我们说,数组就是储存同一类型元素的的集合,那么数组到底改如果创建呢?

type_t arr_name [const_n]
type_t :数组元素的类型
const_n:是一个常量表达式,用来指定数组的大小
arr_name:是数组名

我们在代码中演示如何创建数组

int main()
{
	int arr[3] = { 1,2,3 };
	int i = 0;
	int sz = sizeof(arr)/sizeof(arr[0]);
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

这行代码int arr[3] = { 1,2,3 };·实现了一个含有三个元素的整形数组的创建,之后我们通过循环,遍历了数组元素,获取到了数组当中存储的三个元素。那么我们数组的创建中,在[]里面可不可以使用变量呢?

在这里插入图片描述
我们创建一个变量n将3赋值给他,并且将这个变量用于创建数组,我们发现编译器提示我们应输入常量表达式,因为数组的创建,在C99标准之前,[]中要使用一个常量,在C99标准之后支持了可变长数组的概念,数组的大小可以使用变量指定,但是数组不能初始化。

可变长数组
不是说数组的长度可以任意变化,而是在数组创建之前可以根据用户的输入与需求改变数组创建时的长度。当数组创建完成后,长度不可在变。

数组的初始化

数组初始化是指,在创建数组的同时给数组的内容一些合理的初始值。

int main()

{
	int arr[10] = {1};
}

在这里插入图片描述
通过调试我们发现,我们将数组中第一个元素初始化为1,剩下9个元素,编译器默认初始化为0,我们称这样的初始化为不完全初始化。还有很多初始化方式例如:
int arr[] = {1,2,3,4}这样不指定数组的大小,数组的大小就由初始化的内容来决定。
值得我们注意的是

int main()
{
	char arr1[] = "abc";
	char arr2[] = { 'a','b','c' };
	printf("%d\n",sizeof(arr1));
	printf("%d\n", sizeof(arr2));
}

在这里插入图片描述
我们发现数组当中初始化同样都是给了abc三个字符为什么数组的长度不一样呢?原因是char arr1[] = "abc";这样初始化数组时"abc"这样的字符串有结束标志\0,也被算做数组的元素初始化了。

一维数组的使用

对于数组的使用我们可以使用[],下标引用操作符。我们可以使用他来遍历数组,实现我们需要的一些功能。

int main()
{
	int arr[10] = { 0 };//数组的不完全初始化
   //计算数组的元素个数
	int sz = sizeof(arr) / sizeof(arr[0]);
	//对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以:
	int i = 0;

	for (i = 0; i < 10; i++)
	{
		arr[i] = i;
	}
	//输出数组的内容
	for (i = 0; i < 10; ++i)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

我们可以计算数组的长度,遍历输出数组,获取数组当中任意一个元素。
在数组使用时我们需要注意的就是

1.数组是使用小标访问的,下标是从0开始的。
2.数组的大小可以通过计算得到

一维数组在内存当中的存储

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);

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

在这里插入图片描述
我们通过代码获取到了数组中每个元素的地址,通过观察我们发现,数组元素的地址,随着数组元素的下标增长而增长,我们得出结论数组在内存当中是连续存放的。随着数组下标的增长,地址也由低到高变化。

二维数组

二维数组的创建

二维数组的创建其实和一维数组的创建本质上差不多,只是因为是二维数组所以多了一个行的概念

int main()
{
	int arr[2][3] = { 0 };
}

这样我们就创建一个2行3列的二维数组。

二维数组的初始化

其实二维数组的初始化,与一维数组本质也相同,我们只需要把每一行上的代码看作一个一维数组就可以了。

int main()
{
	int arr[3][4] = { 1,2,3,4,5 };
	int arr[3][4] = { {1, 2, 3}, { 4,5 }};
	int arr[][4] = { {2,3},{4,5} };//二维数组如果有初始化,行可以省略,列不能省略
}

如上图代码,我们可以进行对二维数组的初始化,在{}中的{}用于区分每一行,还有需要注意的地方就是在二维数组中,如果初始化,是可以省略行的,但是列不能初始化。

二维数组的使用

同样与一维数组一样,通过使用[]获取下标的方式,看代码

int main()
{
	int i = 0;
	int arr[2][2] = {0};
	for (i = 0; i < 2; i++)
	{
		int j = 0;
		for (j = 0; j < 2; j++)
		{
			scanf("%d", &arr[i][j]);
		}
	}

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

在这里插入图片描述
我们首先创建一个2行2列的二维数组,之后遍历数组进行赋值,再次遍历数组输出。是不是大致的用法与一维数组相同。

二维数组在内存中的存储

我们说二维数组在创建、初始化、使用等方面都跟一维数组极其相同,但是一个是一维数组一个是二维的,在储存这方面应该有所不同吧,事实是否是这样的呢?我们在代码中寻找答案:

int main()
{
	int arr[3][4] = { 0 };
	int i = 0;
	int j = 0;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 4; j++)
		{
			printf("arr[%d][%d] = %p\n", i, j, &arr[i][j]);
		}
	}
	return 0;
}

在这里插入图片描述
我们通过遍历数组,打印了二维数组中每个元素的地址发现,其实二维数组在内存当中也是连续储存的。每一行的最末尾的元素与下一行第一个元素的地址相邻,地址也是随着数组元素下标的增大而增大的,这样看来,在内存中的存储方式还是与一维数组相同。

数组的越界访问

数组的下标是有范围限制的,数组的下标规定,从0开始,如果有n个元素,那么最后一个元素的下标就是n-1。
如果我们访问时下标小于0或者大于n-1,那么就是数组的越界访问了,超出了数组合法空间的访问。
例如:

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

在这里插入图片描述
当i = 10的时候我们就说,越界访问了,二维数组跟一维数组有同样的越界问题。

数组作为函数参数

冒泡排序


void bubble_sort(int arr[])
{
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - i - 1; 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 i = 0;

	bubble_sort(arr);

	for (i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}

我们使用冒泡排序实现升序排列,原理就是将数组中的元素,依次与他相邻的元素进行比较,如果前面的元素大于与他相邻的后方元素,那么就让这两个元素交换,将数值大的元素向后放,依次进行,实现我们的需求。我们执行我们的代码发现
在这里插入图片描述
只有前两个元素进行了交换,之后的元素没有变化这是为什么呢?我们通过调试发现
在这里插入图片描述
本来应该有10个元素的数组,通过计算竟然算出的数组长度为2,这是为什么呢?原来当数组元素作为参数时,传递是数组的首地址,而并非整个数组。所以数组名字的本质其实是数组的首地址。
注:

  1. sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组。
  2. &数组名,取出的是数组的地址。&数组名,数组名表示整个数组。

所以我们对代码进行更改,我们将数组长度在主函数中算好,传递给自定义函数使用,就可以解决我们的问题。

void bubble_sort(int arr[],int sz)
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - i - 1; 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 i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr,sz);

	for (i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}

在这里插入图片描述
这样我们就实现了我们的需求,好了以上就是关于数组的一些知识点。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_64182409/article/details/126024439

c语言指针篇——数组指针和指向二维数组的指针变量(*p)[n]_我的coder小屋的博客-爱代码爱编程_指向二维数组的指针变量

数组指针 首先,我们先介绍一下二维数组和二维数组的指针,二维数组相当于一个特殊的一维数组里面每个元素又是一个一维数组,例如:int a [ 3 ] [3],可以看成一个3行的一个列数组,每一列的元素又是一个长度为3的数组,

C语言数组——一维数组实例详解-爱代码爱编程

所谓数组,是指将那些具有相同类型的、数量有限的若干个变量通过有序的方法组织起来的一种便于使用的形式。数组属于一种构造类型,其中的变量被称为数组的元素。数组元素的类型可以是基本数据类型,也可以是特殊类型和构造类型。 一维数组 一位数组是最简单的数组类型,它的定义形式如下:类型说明符 数组名[常量表达式] 类型说明符是数组中每个元素的类型,常量表达式是数组

C语言从青铜到王者——数组详解总结【一维数组、二维数组、字符数组、数组实例】-爱代码爱编程

所谓数组,是指将那些具有相同类型的、数量有限的若干个变量通过有序的方法组织起来的一种便于使用的形式。数组属于一种构造类型,其中的变量被称为数组的元素。数组元素的类型可以是基本数据类型,也可以是特殊类型和构造类型。 一维数组 一位数组是最简单的数组类型,它的定义形式如下: 类型说明符 数组名[常量表达式] 类型说明符是数组中每个元素的类型,常量表达式

c语言字节数组怎么定义,《C语言》—— 数组详解-爱代码爱编程

数组的基本概念 我们把一组数据的集合称为 数组(Array) ,它所包含的每一个数据叫做 数组元素 (Element),所包含的数据的个数称为 数组长度 (Length),数组中的每个元素都有一个序号,这个序号从0开始,而不是从我们熟悉的1开始,称为 下标 (Index),所包含数组的里面元素的类型叫做 数组类型 (Type)。 一句话就说清楚了数

C语言二维数组详解-爱代码爱编程

C语言二维数组详解 二维数组的定义 简单理解就是:二维数组由多个一维数组构成 类型 数组名[第一维大小][第二维大小]; type arrayName [x][y];//x,y的大小一般均为常量表达式。 int a[2][3];//定义了一个 2 行 3 列的 int 型二维数组 a。 float b[3][2];//定义了一个 3 行 2

[C语言]二维数组数组名详解,及数组指针传参-爱代码爱编程

指针数组         存放指针的数组 int* arr[3] = { arr1, arr2, arr3 }; 数组指针         指向一个数组的指针 int (*p)[5]; //int表示指向的数组的类型,p表示这个指针的名字,[5]表示这个数组有几个元素。         补充:&arr 和sizeof(arr)中的a

C语言教程——数组(Array)-爱代码爱编程

文章目录 数组一、一维数组的创建和初始化二、二维数组的创建和初始化三、数组越界四、数组作为函数参数总结 数组 变量虽然可以存储数据,但是存放的效率太低了,于是就产生了数组,用来存放一组相同类型的数据。 数组是一组相同类型元素的集合 一、一维数组的创建和初始化 数组的创建方式: type_t arr_name [c

【C语言进阶】经典笔试题数组篇之一维数组详解-爱代码爱编程

一、知识回顾 sizeof(数组名) -数组名表示整个数组的大小,计算整个数组的大小;&数组名:表示整个数组;除此之外,所有的数组名都是数组首元素的地址;sizeof(),求字符串长度时,字符串后自带有\0,也会被记录在内;strlen(),求字符串长度,遇到\0后结束; 二、题目 2.0 一维数组 代码块①: int main()

c语言回顾(指针篇)_最美的愿望一定最疯狂的博客-爱代码爱编程

指针 指针就是一个地址。它指向(代表)了内存中的一块空间 指针的类型 1、指针的类型 把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型 2、指针所指向的类型 把指针声明语句中的指针名字和名字左边的指针

【c语言】经典的递归问题_阿亮joy.的博客-爱代码爱编程

目录 汉诺塔 青蛙跳台阶  结语 汉诺塔   汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次

条件变量解决生产者消费者问题_l_ethan的博客-爱代码爱编程

目录 1.条件变量函数原型 pthread_cond_init pthread_cond_destroy pthread_cond_wait pthread_cond_timedwait pthread_cond_signal pthread_cond_broadcast 2.案例源码 生产者消费者问题:生产者不能在容器满了继续生成

leetcode_位运算_中等_137.只出现一次的数字 ii_小城老街的博客-爱代码爱编程

目录 1.题目2.思路3.代码实现(Java) 1.题目 给你一个整数数组 nums ,除某个元素仅出现一次外,其余每个元素都恰出现三次 。请你找出并返回那个只出现了一次的元素。 示例 1: 输入:nums

c++基础知识(八)-爱代码爱编程

目录 一. 模板的概念 二. 函数模板 1. 使用函数模板: 2. 隐式转换  3. 普通函数与函数模板 (1)区别  (2)调用规则  4. 模板实现机制 5. 模板的局限性(了解) 三. 类模板 1. 类模板的默认类型 2. 复数的模板类(了解) (1)通过成员函数实现 (2)通过重载运算符实现(重载 “+”) 3.

数据结构:队列——队列的概念、顺序和链式存储的实现_队列的顺序存储和链式存储的实现-爱代码爱编程

队列 基本概念队列的顺序存储(循环队列)牺牲一个单元来区分队空和队满入队出队栈空和栈满理解完整代码运行截图 增设size表示元素个数的数据成员栈空和栈满理解完整代码运行截图 增设tag数据成员栈