c语言回顾-数组(全网最详细,哈哈哈) (上):https://developer.aliyun.com/article/1624404
6.步入二维数组
6.1.二维数组的概念
二维数组是C语言中的一种特殊数据类型,用于存储具有两个维度的数据。它可以看作是一个由行和列组成的表格或矩阵,其中每个元素都可以通过行索引和列索引来访问和操作。
6.2二维数组的声明和初始化
dataType arrayName[rowSize][columnSize];
dataType
表示数组中元素的数据类型,可以是整数、浮点数、字符或其他自定义类型。arrayName
是数组的名称,用于在程序中引用数组。rowSize
表示数组的行数,即矩阵的行数。columnSize
表示数组的列数,即矩阵的列数。
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
这声明了一个名为 arr
的二维整数数组,它有3行和5列,总共可以存储3x5=15个整数,并进行了初始化。
二维数组的元素可以通过行索引和列索引来访问。行索引和列索引都从0开始计数,依次递增。例如,要访问二维数组 arr
的第2行第3列的元素,可以使用以下方式:
arr[1][2] = 10; // 将第2行第3列的元素赋值为10
int x = arr[0][3]; // 将第1行第4列的元素的值赋给变量x
printf("%d",arr[2][4]);//打印第2行第4列的元素的值
6.3二维数组元素的输入输出
我们只要能够按照一定的规律产生所有的行和列的数字就行;以上一段代码中的arr数组为例,行的选择范围是0~2,列的取值范围是0~4,借助循环实现生成所有的下标。
#include <stdio.h> int main() { int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7}; int i = 0;//遍历⾏ //输⼊ for(i=0; i<3; i++) //产⽣⾏号 { int j = 0; for(j=0; j<5; j++) //产⽣列号 { scanf("%d", &arr[i][j]); //输⼊数据 } } //输出 for(i=0; i<3; i++) //产⽣⾏号 { int j = 0; for(j=0; j<5; j++) //产⽣列号 { printf("%d ", arr[i][j]); //输出数据 } printf("\n"); } return 0; }
6.4二维数组在内存中的存储
像一维数组一样,我们如果想研究二维数组在内存中的存储方式,可以打印出数组所有元素的地址的。
#include <stdio.h> int main() { int arr[3][5] = { 0 }; int i = 0; int j = 0; for (i = 0; i < 3; i++) { for (j = 0; j < 5; j++) { printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]); } } return 0; }
输出结果:
从输出的结果来看,每一行内部的每个元素都是相邻的,地址之间相差4个字节,跨行位置处的两个元素(如:arr[0][4]和arr[1][0])之间也是差4个字节, 所以二维数组中的每个元素都是连续存放的。
如图所示:
7.C99中的变长数组(补充)
在C99标准之前,C语言在创建数组的时候,数组大小的指定只能使用常量、常量表达式,或者如果初始化数据的时候,可以省略数组大小。
int arr1[10]; int arr2[3+5]; int arr3[] = {1,2,3};
这样的语法限制,让我们创建数组就不够灵活,有时候数组大了就浪费空间,有时候数组又小了就不够用。
C99中给一个变长数组(variable-length array,简称 VLA)的新特性,允许我们可以使用变量指定
数组大小。
int n = a+b;
int arr[n];
在C语言中,变长数组(Variable Length Arrays,简称VLA)是一种特殊的数组类型,它允许数组的大小在运行时动态确定。这一特性在C99标准中引入,使得程序可以更灵活地处理数组大小不确定的情况。
声明变长数组
变长数组的声明与普通数组相似,但它的大小不是一个常量表达式,而是一个变量或表达式的结果。以下是一个变长数组的声明示例:
#include <stdio.h> int main() { int n; printf("Enter the size of the array: "); scanf("%d", &n); // 读取数组大小 int arr[n]; // 声明变长数组 // 输入数组元素 printf("Enter %d elements:\n", n); for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } // 输出数组元素 printf("The elements are:\n"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; }
在这个示例中,数组 arr
的大小由变量 n
的值决定。用户输入数组大小 n
后,程序动态创建一个大小为 n
的数组,并读取和输出 n
个元素。
特点和注意事项
- 作用域和生命周期:
变长数组的作用域和生命周期与其所在的块作用域相同。它在声明的块作用域内有效,块作用域结束时变长数组也随之销毁。 - 运行时确定大小:
变长数组的大小在运行时确定,使得程序可以处理大小不确定的数据结构。 - 不支持全局或静态变长数组:
变长数组不能声明为全局变量或静态变量,只能在函数内使用。 - 内存分配:
变长数组的内存分配在栈上,因此不能使用太大的数组以防止栈溢出。
结束语
本节内容到此结束,内容有点多,感谢友友们到看到最后。
支持小编的点个赞,留个评论吧!!!