C语言的数组

1. 一维数组的创建和初始化

1.1 数组的创建

数组是一组相同元素的集合。

数组的创建方式:

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

数组创建的实例:

int arr[10];
char ch[5];
double data[20];

int n = 10;
int arr1[n];
//在C99标准之前,数组的大小必须是常量或者常量表达式
//在C99之后,数组的大小可以是变量,为了支持变长数组
//变量数组不能初始化

1.2 数组的初始化

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

//不完全初始化,剩余的元素默认初始化为0
int arr1[10] = { 1,2,3 };
int arr2[10] = { 1,2,3,4,5,6,7,8,9,0 };
int arr3[] = { 1,2,3 };

//a  b  c  0  0  0  0  0  0  0
char ch1[10] = { 'a','b','c' };
//a  b  c  \0  0  0  0  0  0  0
char ch2[10] = "abc";
//a  b  c
char ch3[] = { 'a','b','c' };
//a  b  c  \0

数组在创建的时候如果想不指定数组的确定的大小就初始化。数组的元素个数根据初始化的内容来确定。

1.3 一维数组的使用

[],下标引用操作符。它其实就是数组访问的操作符。编号是从零开始的,这里的编号就是下标。

  1. 数组是使用下标来访问的,下标是从0开始的。
  2. 数组的大小可以通过计算得到。
int arr[10];
int sz=sizeof(arr)/sizeof(arr[0]);

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

//数组存放在连续的空间中
int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
for (int i = 0; i < 10; i++)
{
	printf("&arr[%d]=%p\n",i, &arr[i]);
}

2. 二维数组的创建和初始化

2.1 二维数组的创建

int arr[3][4];
char ch[3][5];
double data[2][4];

2.2 二维数组的初始化

int arr9[3][4] = { 1,2,3,4,5,6 };
int arr10[3][4] = { {1,2},{4,5} };
//二维数组行可以省略,但是列不能省略,以此类推三位也是只能省略第一维,后两维不能省略
int arr11[][4] = { {2,3},{4,5} };
int arr12[][4] = { 2,3,4,5 };
int arr[3][4] = {1,2,3,4,2,3,4,5,3,4,5,6};
for (int i = 0; i < 3; i++)
{
	for (int j = 0; j < 4; j++)
	{
		printf("%d ", arr[i][j]);
	}
	printf("\n");
}

2.3 二维数组在内存中的存储

二维数组也是存放在一片连续的空间中的,arr[0][j]后紧接着存放arr[1][j]

3. 数组越界

数组下标是有范围限制的。

数组的下标规定是从零开始的,如果数组有n个元素,最后一个元素的下标就是n-1。所以数组的下标如果小于0或大于n-1,就是数组越界访问了,超出了数组合法空间的访问。

C语言本身不做数组下标的越界检查,编译器也不一定会报错,但是编译器不报错并不意味着程序就是正确的。

4. 数组作为函数参数

通过冒泡排序函数将一个整型数组排序。

4.1 冒泡排序函数的错误设计

//数组名本质上是:数组首元素的地址
//地址是应该使用指针来接收,所以arr这里看似是数组,本质是指针变量。
void bubble_sort(int arr[])
{
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < sz-1; i++)			//趟数
	{
		for (int j = 0; j < sz - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

正确应该是

void bubble_sort(int arr[], int sz)
{
	
	for (int i = 0; i < sz-1; i++)			//趟数
	{
		for (int j = 0; j < sz - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

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

4.2 数组名是什么

数组名确实能表示首元素的地址,但是有两个例外:

  1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节。
  2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
int arrC[10] = { 1,2,3,4,5 };
int arrC[10] = { 1,2,3,4,5 };
printf("%p\n", arrC);					//arr就是首元素地址
printf("%p\n", arrC+1);					//sizeof加一是加上一个元素的字节数
printf("--------------------");
printf("%p\n", &arrC[0]);				//首元素地址
printf("%p\n", &arrC[0]+1);
printf("--------------------");
printf("%d\n", &arrC);					//数组地址
printf("%d\n", &arrC+1);                //这里是加上一个数组的字节数
printf("--------------------");

二维数组的数组名的理解:

int arr[3][4]={0};
printf("%p\n",arr);        //是首元素arr[0][i]的地址,当sizeof加一的时候为arr[1][0]的地址

此时sizeof(arr)是二维数组大小,sizeof(arr[0])是数组[0][0]到[0][3]的大小,sizeof(arr[0][0])是第一个元素的大小。

相关推荐

  1. C语言数组

    2024-02-12 13:40:01       30 阅读
  2. C语言数组

    2024-02-12 13:40:01       14 阅读
  3. C语言指针数组 指针运算

    2024-02-12 13:40:01       54 阅读
  4. C语言数组语法解剖

    2024-02-12 13:40:01       32 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-12 13:40:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-12 13:40:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-12 13:40:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-12 13:40:01       20 阅读

热门阅读

  1. C# Thread的使用

    2024-02-12 13:40:01       34 阅读
  2. 时间函数举例2

    2024-02-12 13:40:01       32 阅读
  3. 求小数的某一位(c++题解)

    2024-02-12 13:40:01       31 阅读
  4. H5/CSS 笔试面试考题(61-70)

    2024-02-12 13:40:01       34 阅读
  5. VSCode官方历史版本下载

    2024-02-12 13:40:01       38 阅读
  6. Leetcode 3035. Maximum Palindromes After Operations

    2024-02-12 13:40:01       37 阅读
  7. Ubuntu搭建计算集群

    2024-02-12 13:40:01       41 阅读
  8. 装箱问题+宠物小精灵之收服+数字组合——01背包

    2024-02-12 13:40:01       28 阅读