C语言中,不规则数组与指针是最常用的数据结构之一。不规则数组是指其内部每个一维数组的长度可能不同,而指针则可以用来访问二维及以上的数组。下面我将详细讲解不规则数组与指针的用法及其两个示例说明。
不规则数组
不规则数组可以使用嵌套的一维数组的方式来实现,示例如下:
int a[3][4] = { // 定义一个二维数组a
{1, 2, 3, 4},
{5, 6, 7},
{8, 9}
}
上述代码中,数组a
的第一维有3个元素,而它的第二维分别为4、3、2个元素。为了遍历这样的不规则数组,我们需要使用双重循环,其中内层循环的终止条件应该以内部一维数组的长度为依据。示例代码如下:
for(int i = 0; i < 3; ++i) { // 遍历第一维
for(int j = 0; j < sizeof(a[i]) / sizeof(int); ++j) { // 遍历第二维
printf("%d ", a[i][j]); // 输出数组元素
}
printf("\n");
}
上述代码中,内层循环通过计算数组元素的大小除以所占字节长度来计算内部一维数组长度,从而达到遍历每个内部数组的目的。
指针
除了使用不规则数组进行处理,我们还可以常用利用指针的方式来实现对不规则数组的访问。指针可以用来访问数组中的每一个元素,从而避免了对全部复杂数据类型的复制,节省了空间和时间。下面是一个通过指针访问不规则数组的示例代码:
int a[3][4] = { // 定义一个二维数组a
{1, 2, 3, 4},
{5, 6, 7},
{8, 9}
};
int *p = NULL; // 声明一个指针
for(int i = 0; i < 3; ++i) { // 遍历第一维
p = a[i]; // 让指针指向每个内部数组的第一个元素
for(int j = 0; j < sizeof(a[i]) / sizeof(int); ++j) { // 遍历第二维
printf("%d ", *(p++)); // 输出指针指向的每个元素,并将指针指向下一个元素
}
printf("\n");
}
上述代码中,我们声明了一个指针p
来访问数组a
的每一个元素,内部p
指针的类型应该与数组元素的类型相同。此外,每次内层循环结束之前要先将p
指针指向下一个元素,以便于遍历下一个元素。
示例说明
下面是两个针对不规则数组和指针的例子:
1. 不规则数组示例
假设我们需要将一个学生列表中每个学生的名字、学号、生日和成绩按照姓名字典序排序,首先我们需要将学生按照拼音字母序放到数组中,代码如下:
char *students[4][3] = { // 定义一个不规则数组
{"Tom", "20190501", "2000.01.01"},
{"Mary", "20190502", "1999.03.06", "89.5"},
{"Lucy", "20190503", "2001.05.15"},
{"David", "20190504", "2000.07.20", "75.5"}
};
上述代码定义了一个不规则数组来存放学生信息,其中每行记录了一个不定长度的学生信息。接着我们需要编写一个排序算法,按照学生的姓名来进行排序。示例代码如下:
void sort(char *students[4][3], int size) { // 排序函数,接受一个不规则数组和规则数组长度
for(int i = 0; i < size - 1; ++i) { // 冒泡排序
for(int j = i + 1; j < size; ++j) {
if(strcmp(students[i][0], students[j][0]) > 0) { // 比较学生姓名字典序
char *temp[3] = {0}; // 交换学生成绩信息
memcpy(temp, students[i], sizeof(char *) * 3);
memcpy(students[i], students[j], sizeof(char *) * 3);
memcpy(students[j], temp, sizeof(char *) * 3);
}
}
}
}
上述代码中,我们利用了C语言内置的标准库函数strcmp
来比较学生的姓名的字典序大小,将其结合冒泡排序算法实现了对学生的姓名排序。
2. 指针示例
假设我们需要对一个内部不规则数组的每行元素进行求和,我们需要先通过指针访问这个不规则数组的每一行内部元素,然后再进行求和。示例代码如下:
int arr[3][4] = { // 定义一个二维数组
{1, 3, 5, 7},
{2, 4, 6},
{9, 8}
};
int sum = 0;
for(int i = 0; i < 3; ++i) { // 遍历每一行
int *p = arr[i]; // 定义指针p指向每一行的第一个元素
for(int j = 0; j < sizeof(arr[i]) / sizeof(int); ++j) { // 遍历每一行的元素
sum += *(p++); // 求和
}
}
printf("sum=%d\n", sum);
上述代码中,我们利用了指针的特性来访问不规则数组中的每一个元素,并通过遍历求出了不规则数组中所有元素的和。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言不规则数组和指针 - Python技术站