C语言学习心得-一维数组

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

数组存放的是1个或者多个数据,但是数组元素个数不能为0
数组中存放的多个数据,类型是相同的

(一)数组的定义及初始化

// 数组的创建
int main()
{
	int math[20] = { 0 }; // 数组有20个元素,每个元素是int型
	char ch[5] = { 'a','b','c','d','e' };// 注意是char类型的,字符型,不是字符串,没有‘\0’,这点与下方定义的字符串数组不一样
	char ch1[5] = "ben";// 可以用字符串给字符数组初始化'b','e','n','\0',编译器在给数组赋值时,自动以(字符串的结尾\0),这里和上面定义的字符数组不一样,因为字符串结束是以字符‘\0’结尾的

	double arr[6] = { 1.0,1.1,1.2,1.3,1.4,4.5 };// 定义一个双精度浮点数数组

	int arr[10] = { 0 };
	// 数组的元素类型是int
	// 数组的类型是 int[10],注意是数组的类型,不是数组元素的类型
	int arr2[5] = { 0 };
	// 数组的类型是int[5]

	// 数组是一组同类型元素的集合,即数组中存放的多个数据,类型是相同的
	// 数组存放的是1个或者多个数据,但是数组元素个数不能为0
	// 数组分为一维数组和多维数组,多维数组一般比较多见的二维数组

	// 当对数组进行初始化时候,数组的大小可以省略,编译器会根据数组的初始化内容,自动计算数组的个数
	// 对应n个元素的数组,如果数组是从0开始的,最后一个数组的下标是n-1
	int arr3[10] = { 1,2,3,4,5,6,7,8,9,10 };
	// 10是指针数组的元素个数的
	printf("%d\n", arr3[5]);// []--下标引用操作符 输出6
	// 这里的5指的是数组的下标
	
}

数组的定义和初始化应该很容易就能看明白,需要重点强调几个方面

1、对于 int arr[10] = {1,2,3,4,5,6,7,8,9,10};这个数组元素的类型是int,对整个数组来说其类型是int[10]。

     整体看起来就是,开辟一个名字叫做arr的数组,里面包含了10个int型元素,其中10个元素是1,2,3,4,5,6,7,8,9,10,即10个整形的数,不能存放浮点数。

2、数组的下标是从0开始的,不是从1开始的,即数组元素1对应下标0,因此:

打印arr[0]的结果是1;

打印arr[9]的结果是10;

扩展到n个元素的数组,其数组最高元素下标即为n-1,可以写为arr[n-1]。

如过打印arr[10]编译器会报“数组越界”错误,是非常危险的,这意味着数组溢出,特别是在嵌入式编程中因为成本原因,内存往往很小,很有可能会占用其他变量的内存,导致数据错误。

(二)数组的遍历

// 数组的遍历
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    // 用for循环遍历数组
	//for (int i = 0; i < 10; i++) // 这里可以看出数组下标从0开始9结束
	//{
	//	printf("%d ", arr[i]);
	//}

	int i = 0;
	while (i < 10)// 这里可以看出数组下标从0开始9结束
	{
		printf("%d ",arr[i]);
		i++;
        //第1次进入while循环时i = 0,对应数组下标arr[0]元素打印
        //第2次进入while循环时i = 2,对应数组下标arr[1]元素打印
        //......
	}

}

可以看出无论使用哪种数组遍历方法进行循环,其结果都是一样的

// 给数组中输入10个值 再打印出来
int main()
{
	int arr[10] = {0};
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		scanf("%d",&arr[i]); //这里是一个整形元素,只有单个数组名,才是地址
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
}

这里需要强调一下:

1、scanf的用法,可以自动过滤输入数中的空格、回车、换行符,就算输入的是:

1 2 3 

4

5

6 7 8 9 

这种奇怪的输入方式,一样可以输出正确的数组:1 2 3 4 5 6 7 8 9 10

2、数组名arr单独写的时候,对应着arr数组的首地址,与&arr[0]是一致的,&即取地址符号,这个后面会详细说,是比较绕人的一个部分。

(三)数组在内存中的存放

//  一维数组在内存中的存储
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	// 打印10个元素的地址
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("&arr[%d] = %p\n",i,&arr[i]); // &取地址操作符,取出变量在内存中的地址

	}
	printf("arr = %p\n",arr);
	/* 
		&arr[0] = 008FFD0C
		&arr[1] = 008FFD10
		&arr[2] = 008FFD14
		&arr[3] = 008FFD18
		&arr[4] = 008FFD1C
		&arr[5] = 008FFD20
		&arr[6] = 008FFD24
		&arr[7] = 008FFD28
		&arr[8] = 008FFD2C
		&arr[9] = 008FFD30
        arr = 008FFD0C
		1、从上面可以看出,每一个元素地址差了4个字节,即连续存放的10个整形变量
		2、随着数组下标的增长,地址也是由小到大(由低到高)增长的
	*/
	return 0;
}

程序详解:

1、这段程序定义了一个存放10个整形元素的数组

2、从数组下标0开始打印数组元素的地址

注意:

1、元素arr[0]的地址是008FFD0C,这个地址是数组起始元素的地址,

最后打印的arr是数组名,也是数组arr的首地址,其地址是008FFD0C。

所以&arr[0]和数组名arr表达的意义是一样的。

2、因为数组arr[10]是存放了10个元素的整形数组,每一个元素都是整形,所以每一个元素占4个字节,而每一个元素的地址差4个字节,即连续存放10个整形变量。

3、数组的分布是从内存地址低到内存地址高增长的

(四)sizeof的用法

// sizeof 的用法
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("数组的总大小是%d。\n", sizeof(arr));// sizeof内是数组名的时候,代表的是整个数组的大小
	printf("数组一个元素的大小是:%d。\n",sizeof(arr[0]));
	printf("数组一共有%d个元素。\n", sizeof(arr) / sizeof(arr[0]));
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < sz; i ++ )
	{
		printf("%d ",arr[i]);
	}

	// int arr[] = { 0 }; // 未指定数组数量,大括号内只有一个0,所以这个数组定义一个元素

	return 0;
}

需要注意的地方:

1、之前说了数组的名字是数组的首地址,即arr[0]的地址,所以此处数组名被用作指向数组第一个元素的指针常量

2、程序中:printf("数组一共有%d个元素。\n", sizeof(arr) / sizeof(arr[0]));

显然此处中sizeof(arr)中的arr肯定不是数组的地址,要不sizeof(地址),是没有意义的 ,所以此处的arr代表的是整个元素所占用的内存空间,所以sizeof(arr)代表的arr数组所占用内存空间的大小,而sizeof(arr[0])表示数组元素的大小,所以sizeof(arr) / sizeof(arr[0])即可以求出数组元素数量10.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值