【C语言】数组

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


数组可以说是目前为止讲到的第一个真正意义上存储数据的结构。虽然前面学习的变量也能存储数据,但变量所能存储的数据很有限。不仅如此,数组和指针(后续会讲)是相辅相成的,学习数组可以为学习指针打下基础。
那么到底什么是数组呢?顾名思义数组就是很多数的集合!那么这些数有没有什么要求呢,是不是不管什么数组合在一起都是数组呢?同一数组中存储的数必须满足以下两个条件:
1. 这些数的类型必须相同。
2. 这些数在内存中必须是连续存储的。
换句话说,数组是在内存中连续存储的具有相同类型的一组数据的集合。

一维数组的创建
类型说明符 数组名[ 常量 表达式];

一维数组初始化
(1)完全初始化:int a[5] = {1, 2, 3, 4, 5};

(2)不完全初始化:int a[5] = {1, 2};

                                  char arr1[5]={'H','e'};
                                  char arr2[10]="hello"; // 此时数组中第6个元素的值为'\0'
                                  char arr2[8]={'a',98};

(3)如果定义数组时就给数组中所有元素赋初值,那么就可以不指定数组的长度,因为此时元素的个数已经确定了。编程时我们经常都会使用这种写法,因为方便,既不会出问题,也不用自己计算有几个元素,系统会自动分配空间。例如:

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

sizeof和strlen的区别:
sizeof的功能是计算一个数据类型的大小,这个类型可以是数组、函数、指针、对象等,单位为字节,它的返回值是size_t类型,也就是unsigned int类型,是一个无符号整数。注意:sizeof不是一个函数,它是一个运算符,所以它不需要包含任何头文件。 


strlen的功能是计算一个指定字符串的长度,函数原型是size_t strlen(const char *s),它的返回值是size_t类型,也就是unsigned int类型,返回的是字符串的长度,需要包含头文件#inlude <string.h>,参数s是字符串首地址。

 区别:
1、sizeof会将空字符\0计算在内,而strlen不会将空字符\0计算在内;
2、sizeof会计算到字符串最后一个空字符\0并结束,而strlen如果遇到第一个空字符\0的话就会停止并计算遇到的第一个空字符\0前面的长度。

#include <stdio.h>
int main() {
 char arr[] = "hello";
 int size = sizeof(arr);
 int length = strlen(arr);
 printf("size = %d, length = %d",size,length);
}

2、一维数组的使用

对于数组的使用我们之前介绍过一个操作符:[],下标引用操作符。通过它可以操作数组中的元素。
 

#include <stdio.h>
int main() {
 int arr[10] = { 0 }; // 数组的不完全初始化
 // 计算数组中元素的个数
 int length = sizeof(arr) / sizeof(arr[0]);
 // 对数组内容赋值,数组的元素是使用下标来访问的,下标从0开始
 int i = 0; // 下标
 for (; i < length;i++) {
 arr[i] = i;
 }
 // 输出数组的内容
 for (i = 0; i < length;i++) {
 printf("%d\n",arr[i]);
 }
}

总结:
1、数组元素是使用下标来访问的,下标从0开始
2、数组的大小可以通过计算获得,字符数组的长度还可以通过strlen计算获得。
int arr[10] = { 0 }; 
int length = sizeof(arr) / sizeof(arr[0]);
char arr2[]="Hello";
int length2 = strlen(arr2);

3、一维数组在内存中的存储

#include <stdio.h>
int main() {
 int arr[10] = { 0 };
 // 计算数组中元素的个数
 int length = sizeof(arr) / sizeof(arr[0]);
 int i = 0; // 下标
 for (; i < length; i++) {
 arr[i] = i;
 }
 // 输出数组中每个元素的地址
 for (i = 0; i < length; i++) {
 printf("%p\n", &arr[i]);
 }
}

仔细观察输出的结果,随着数组下标的增长,元素的地址也在有规律的递增。由此可以得出结论:数组在数组中是连续存放的。

4、二维数组的创建与初始化

(1)二维数组的创建

int arr[3][4];
char arr[3][5];
double arr[2][4];
(2)二维数组的初始化

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


5、二维数组的使用 

include <stdio.h>
int main() {
 // 打印二维数组
 int arr[3][5] = { {2,4,6},{1,3,5} };
 // 获取行数
 int rows = sizeof(arr) / sizeof(arr[0]);
 // 获取每一行中元素的个数
 int cells = sizeof(arr[0]) / sizeof(arr[0][0]);
 for (int i = 0; i < rows;i++) { // 遍历行
 for (int j = 0; j < cells;j++) {
 printf("%d ", arr[i][j]);
 }
 printf("\n");
 }
}

6、二维数组在内存中的存储 

#include <stdio.h>
通过结果分析,其实二维数组在内存中也是连续存储的。
int main() {
 // 打印二维数组
 int arr[3][5] = { {2,4,6},{1,3,5} };
 // 获取行数
 int rows = sizeof(arr) / sizeof(arr[0]);
 // 获取每一行中元素的个数
 int cells = sizeof(arr[0]) / sizeof(arr[0][0]);
 for (int i = 0; i < rows;i++) { // 遍历行
 int* temp = arr[i];
 printf("%p\n",temp);
 for (int j = 0; j < cells;j++) {
 printf("%p ", &temp[j]);
 }
 printf("\n");
 }
}

通过结果分析,其实二维数组在内存中也是连续存储的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值