元小白(猿小白)进阶日记:七(数组)

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

一、一维数组
1、数组的创建

type_t arr_name [const_n];
//type_t  是指数组的元素类型
//const_n  是一个常量表达式,用来指定数组的大小,即元素个数
例如:
int  arr1[10];
char  arr2[30];
float  arr3[33];

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

int x=10;//初始化
int  x;	x=10;//赋值

定义变量步骤: 开辟空间和放入初始值,同时进行,叫初始化,分开完成叫赋值
例如:

int  a[10]={1,2,3};//给a[0],a[1],a[2]按顺序初始化,其他的未初始化的系统默认为0;
int  b[]={1,2,3,4};//没有指定数组大小,系统会根据初始化中的元素个数来定,此数组有4个元素
char c[3]={'a',98,'c'};//此数组为char型,则元素98代表的是ASCLL码表中的字符‘b’.
char d1[]={'a','b','c'};//数组大小为3
char  d2[]={'a','b','c','\0'};//数组大小为4;
char e[]="abc"//数组大小为4,因为字符串自带‘\0’,
注:int a[10]={1,2,3};		 a={4,5,6};这两句语句不能实现。

数组在创建时如果不想指定数组的大小,就必须初始化,

3、一维数组的使用
数组的 [ ] 下标引用操作符,就是数组访问的操作符
例如:
求数组的大小
数组是使用下标访问的,下标从0开始

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7 };//不完全初始化
	int len = sizeof(arr) / sizeof(arr[0]);//求数组元素个数。在哪儿创建的数组在哪儿求大小。
	//int 型---4个字节----10个元素共40个字节----40/4=10个元素
	int i = 0;
	for (i = 0; i < len; i++)
	{
		arr[i] = i;//除了初始化以外,数组的赋值只能通过遍历一个一个的赋值
		printf("arr[%d]=%d\n", i, i);
	}
	for (i = 0; i < len; i++)
	{
		printf("arr[%d]=%d\n", i, i);//数组的输出只能通过遍历数组输出。
	}
	printf("%d",len);
	return 0;
}

输出数组的地址
数组的地址是一次性分配的,由低地址到高地址的分配且连续。
int arr[10]={0};中arr代表数组arr的首地址,也就是arr[0]的地址。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7 };
	int len = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for (i = 0; i < len; i++)
	{
		printf("arr[%d]=%p\n", i, &arr[i]);//%p是用于专门输出地址的字符
	return 0;
}

二、二维数组
可以将二维数组看作是由一维数组构成
可以将n维数组看作是由多个(n-1)维数组构成
例如:
int arr[3][4]={{1,2,3,4},{1,2,3,4},{,1,2,3,4}};
1、二维数组的创建

数据类型  数组名  [  常量1][常量2]
例如:
int arr1[10][10]={0};
char  arr2[ ][10]={0};

2、数组的初始化
例如:

 int arr1[3][4]={1,2,3,4};//意味着1 2 3 4   0 0 0 0    0 0 0 0
   int arr2[3][4]={{1,2},{3,4}};//意味着1 2 0 0    3 4 0 0   0 0 0 0 
   int arr3[ ][5]={{2,3},{4,5}};//意味着2 3 0 0   4 5 0 0  ,二维数组最多可以不填第一个[ ]的内容,多维数组也是这样,其他的[ ]都不可空着,
   int  row=sizeof(arr1)/sizeof(arr1[0]);//计算的是行数;

3、二维数组的使用

输出数组及其地址

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int arr[3][4]= {0};
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 4; j++)
		{
			arr[i][j] = i * 4 + j;
		}
	}
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 4; j++)
		{
			printf("arr[%d][%d] =%d\n",i,j,arr[i][j]);
		}
	}
	for (i = 0; i < 3; i++)
	{
	int j = 0;
	for (j = 0; j < 4; j++)
	{
		printf("Dress---arr[%d][%d] =%p\n", i, j, arr[i][j]);
	}
		return 0;
	}

三、数组传参
数组传参时会降低维度,会降维为只想其内部怨怒类型的指针。
数组作为函数参数时不会把整个数组传过去。
实际上只是把数组的首地址传过去了,所以即使在函数参数部分写成数组的形式:int arr[ ]表示的依然是一个指针:int* arr;
数组传参,如果函数内部需要知道数组元素个数,应该在函数外部算出元素个数,以参数的形式传递给函数。

例如:
求数组长度

❌错误求法

下面的程序结果为1
因为传入函数的是数组的首地址,也就是一个整型指针,整型指针大小为4个字节,arr[0]是一个整数,大小也为4,4/4=1;

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int Len(int arr[])
{
	int len=sizeof(arr) / sizeof(arr[0]);
	return len;
}
int main()
{
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
	printf("len=%d\n", Len(arr));
	return 0;
}

✔正确求法

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
	int len=sizeof(arr) / sizeof(arr[0]);
	printf("len=%d\n", len);
		return 0;
}
如果函数有需要,则将其作为函数参数传入即可。

猜你喜欢

转载自blog.csdn.net/weixin_44748803/article/details/89046683