c语言3-数组详解

178 阅读4分钟

1.一维数组

  • 一维数组的创建和初始化
  • 一维数组的使用
  • 一维数组在内存中的存储

2.二维数组

  • 二维数组的创建和初始化
  • 二维数组的使用
  • 二维数组在内存中的存储

*3.数组作为函数参数


1.1一维数组的创建和初始化

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

初始化:在创建数组的同时给元素赋值

注意:数组创建时,[]里面可以用常量,也可以用宏定义,但是不能使用变量

一维数组的创建

 type_t arr_name [const_n]
 ​
 //tyoe_t 数组中元素类型
 //arr_name 数组名
 //const_n 常量表达式:用来指定数组大小
 ​
 如:
 int arr1[10];
 或:
 #define M 3
 int arr2 [M];

一维数组的初始化

1.完全初始化(数组大小==数值个数)

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

2.不完全初始化(数组大小>数值个数)

后面没被赋值的元素全部默认为/0;

 int arr[5]={1,2,3};
 int arr[]={1,2,3};
 char arr[]={'a','b','c'};

🔴对于字符数组存储字符串

由于C语言中没有字符串类型,字符串是存放在char型数组中的,将字符串作为char数组来处理

为了测定字符串的实际长度,字符串需要一个结束标志。

故:存放字符串时,需要一个空间用来存储'\0'。

[字符串的结束标志'\0']

char arr[]="abcde";

char arr[10]="abcde"

//由于数组大小>字符串个数,元素e后面默认存放'\0'

char arr[5]="abcde";

//由于数组大小=字符串个数,元素e后面没有空间存放"\0"

故:无法读取字符串的结束标志,导致字符串长度和内容随机

(可能该字符串在后面的某个空间地址存放了'\0'才使得读取结束)

1.2一维数组的使用

[],下标引用操作符(用来进行数组内容访问)

数组中每个元素都有一个序号,这个序号是从0开始,称为下标

💡 sizeof()是操作符,用于计算数组(整个数组/单个元素)大小,以字节为单位

 #include<stdio.h>
 ​
 int main()
 {
 int arr[5]={1,2,3,4,5};//数组创建和初始化
 ​
 int sz=sizeof(arr)/sizeof(arr[0]);//计算数组元素个数
 ​
 int i=0;
 for(i=0;i<sz;i++)//打印数组每个元素
 {
 printf("%d",arr[i]);//访问下标i所对应的内容
 }
     return 0;
 }
 //结果:输出12345
 ​
 //sizeof(arr) 求整个数组的大小
 //sizeof(arr[0]) 求一个元素的大小

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

一维数组在内存中是连续存放的(由低地址-----到高地址)

数据类型

char 1字节

short 2字节

int,float,long,unsigned long 4字节

double, long long 8字节

注意:指针类型(无论什么数据类型) 4字节(32位操作系统),8字节(64位操作系统)

每次需要开辟(元素个数*类型大小)个字节空间。

2.1二维数组的创建和初始化

🔻一个二维数组可以看成多个一维数组

(一个行数代表一个一维数组)

二维数组的创建

注意:行数可以忽略不写,但是列数必须要写

 int arr[2][4]//[行数][列数]
 int arr[][4]

二维数组的初始化

 int arr[2][4]={1234}
 //结果:
 1 2 3 4
 0 0 0 0
 int arr[2][4]={{12},{34}}
 //结果:
 1 2 0 0
 3 4 0 0
 int arr[][4]={{1,2},{3,4}}
 //结果:
 1 2 0 0
 3 4 0 0
 ...

注意:一个{}代表一个一维数组的初始化。未被赋值的元素用0初始化

2.2二维数组的使用

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

如果要打印二维数组,需要使用双重循环嵌套的方式

 #include<stdio.h>
 ​
 int main()
 {
 int arr[2][4]={1,2,3,4};
 int i,j=0;
 for(i=0;i<2;i++)//行数为i,即有i个一维数组
 {
     for(j=0;j<4;j++)//每一个一维数组有j个元素
     {
         printf("%d ",arr[i][j]);
     }
     printf("\n");
 }
     return 0;
 }
 //结果:
 1 2 3 4
 0 0 0 0

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

二维数组在内存中是连续存放的(由低地址-----到高地址)

💡二维数组的本质也可以看成一维数组,只是元素是一维数组

每次需要开辟(元素个数*类型大小)个字节空间。

*3.1数组作为函数参数

3.1.1一维数组

调用函数传参数组时

传值:由于形参是实参的一份临时拷贝,如果数组过大,成本(时间和空间)会大大增加

传址:运用指针的方式,让其指向内部元素

 int arr[5]={1,2,3,4,5}
 //代表有5个元素的一维数组,该元素的类型是int
 ​
 sizeof(arr)//数组总大小
 sizeof(arr[0])//数组中一个元素大小
 ​
 //实参
 (arr)//代表数组首元素地址
 (arr+1)//代表数组首元素的下一个元素地址
 (&arr)//代表整个一维数组地址,但是地址也是指向首元素地址
 (&arr+1)//代表跳过整个一维数组,指向紧挨的地址
 ​
 //形参
 int arr[]//形参元素个数可以省略(可能改变实参的大小)
 int* arr

&数组名,取出的是整个数组的地址

sizeof(数组名),计算整个数组的大小

3.1.2二维数组

把二维数组当成多个一维数组

每个元素是一维数组(即指针+1时,是+一个一维数组)

int arr[2][2]={0}
//代表有两个一维数组元素的二维数组,该一维数组元素的类型是int

//实参
(arr)//代表数组首元素(第一个一维数组)地址
(arr+1//代表数组首元素的下一个元素的地址(指向第二个一维数组的首元素)
(&arr)//代表整个二维数组,但是地址也是指向首元素地址(第一个一维数组)
(&arr+1//代表跳过二维数组,指向紧挨着的地址

//形参
int arr[][2]
int(*arr)[2]

🔴*指针数组数组指针

*指针数组:数组,数组的元素是指针

数组指针:指针,指向数组

优先级:()> [ ] > *

*pa[n]:指针数组,pa是数组,元素有n个,该元素的类型是指针

(*pa)[n]:数组指针,pa是指针,指向一个一维数组,该数组元素n个

//指针数组
在(0-5内)输入中文数字,打印英文数字

#include<stdio.h>

int main()
{
	char* arr[6] = { {"zero"},{"one"},{"two"},{"three"},{"four"},{"five"} };
	int n;
	scanf_s("%d", &n);
	printf("%s", arr[n]);

	return 0;
}
//结果:输入1 输出one
//数组指针
int arr[2][2] = { 0,1,1,2 };
//一个有两个元素
0 1// 第一个一维数组元素
1 2//第二个二维数组元素
int(*pa)[2] = arr;//该指针指向首元素地址(第一个一维数组)