初级C语言:3 数组

本文详细介绍了C语言中一维数组的建立、初始化、使用、内存存储以及二维数组的概念、创建、初始化、内存布局,还讨论了数组的越界问题和作为函数参数的应用,以冒泡排序为例。
摘要由CSDN通过智能技术生成

3.1 一维数组

3.1.1 一维数组的建立与初始化

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

一维数组的创建形式:

元素类型+数组名+[一个常量表达式,用来指定数组的大小]。

Eg:

   char arr1[10];

   int count = 10;

   int arr2[count];

数组初始化:

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

Eg: char arr1[]=′ABCD′

3.1.2 一维数组的使用

下标引用操作符:[ ]。它其实就数组访问的操作符。

#include <stdio.h>
int main()
{
	int arr1[5] = { 1,2,3,4,5 };//下标引用:arr1[下标]
	int a = sizeof(arr1) / sizeof(arr1[0]);
	for (int i = 0; i < a; i++)
	{
		printf("%d",arr1[i]);
	}
	return 0;
}

注意:

1. 数组是使用下标来访问的,下标是从0开始。

2. 数组的大小可以通过计算得到。sizeof(arr1) / sizeof(arr1[0]);

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

#include <stdio.h>
int main()
{
	int arr1[5] = { 1,2,3,4,5 };//下标引用:arr1[下标]
	int a = sizeof(arr1) / sizeof(arr1[0]);
	for (int i = 0; i < a; i++)
	{
		printf("&arr1[%d]=%p\n",i, &arr1[i]);
	}
	return 0;
}

注意:随着数组下标的增长,元素的地址,也在从地址向高地址有规律的递增。即:数组在内存中是连续存放的。

3.2 二维数组

3.2.1 二维数组的建立与初始化

二位数组就是将同一类型的数据通过行列式的形式进行存储。

二维数组的创建形式:

元素类型+数组名+[常量表达式,行的大小] [常量表达式,列的大小]。

Eg:

int arr[3][4];

double arr[2][4];

二维数组的初始化:

int arr[3][4] = {1,2,3,4};

int arr[3][4] = {{1,2},{4,5}};

int arr[ ] [4] = {{2,3},{4,5}};//二维数组如果有初始化,行可以省略,列不能省。三维数组第一维可以省略,后两维不能省略。

3.2.2 二维数组的使用

二维数组的使用也是通过下标的方式。

#include <stdio.h>
int main()
{
	int arr[2][4] = { 1,2,3,4,8,7,6,5 };//1 2 3 4;8 7 6 5
	int arr1[2][5] = { {1,2,3,4},{5,6,7,8} };//1 2 3 4 0;5 6 7 8 0
	int a = sizeof(arr) / sizeof(arr[0]);//行数
	int b = sizeof(arr[0]) / sizeof(arr[0][0]);//列数
	int i = 0;
	for (i = 0; i < a; i++)
	{
		int j = 0;
		for (j = 0; j < b; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

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

二维数组在内存中的存储跟一维数组在内存中的存储是一样的(如:int arr[3][4]=int arr[12]),只是表现形式与引用形式不同。即:二维数组在内存中也是从低地址到高地址连续存放的。

3.3 数组的越界

数组的下标是有范围限制的。数组引用的下标超出了有限范围,就是数组越界访问了。C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的。

3.4数组作为函数参数

冒泡法排序:

//数组作为函数参数
//冒泡法,升序排列
#include <stdio.h>
void bubble_sort(int arr[], int a)//形参是数组的形式:接受数组=接受的是指针变量;
 //或者写为形参是指针的形式:void bubble_sort(int *arr, int a)
{
	int i = 0;
	for (i = 0;i < a - 1; i++)
	{
		int j = 0;
		for (j = 0; j < a - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int n = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = n;
			}
		}
	}
}
int main()
{
	int arr[10] = { 7,4,3,5,2,8,9,1,6,10 };
	int a = sizeof(arr) / sizeof(arr[0]);//不能在子函数内部求数组个数,因为子函数接受的为指针变量
	bubble_sort(arr,a);//传递数组名=传递数组首元素的地址
	for (int i = 0; i < a; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

 数组名:

数组名确实能表示首元素的地址

但是有2个例外:

1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节

2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址

注意:二维数组的数组名也表示数组首元素的地址,但其表示的是第0行的地址

sizeof(arr) / sizeof(arr[0]);//行数,sizeof(arr)总数组的大小,sizeof(arr[0])=一行的大小

sizeof(arr[0]) / sizeof(arr[0][0]);//列数,sizeof(arr[0][0]),首元素的大小

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值