下面我来详细讲解“赌你会懵的C语言指针进阶数组场景解析”的完整攻略。
概述
在C语言中,数组是非常常用的数据类型。但是对于数组的理解,不仅要理解数组的基本概念,还要深入理解数组和指针的关系。本文将通过两条示例来解析C语言指针进阶数组场景,并教会你如何正确地理解和使用指针和数组。
示例1:指针数组
假设我们有一个学生结构体,并且需要定义一个数组来存储多个学生的信息。我们可以这样定义:
struct Student
{
char name[20];
int age;
float score;
};
struct Student arr_stu[3] = {
{"Tom", 18, 89.5},
{"Jerry", 19, 96.0},
{"Mickey", 20, 98.0}
};
但是,如果我们需要在一个函数中访问这个学生数组,并且还需要对数组中的元素进行修改,此时就需要用到指针。我们可以使用指针数组来实现:
struct Student
{
char name[20];
int age;
float score;
};
void modifyScore(struct Student *stu)
{
stu->score += 10;
}
int main()
{
struct Student *p_arr_stu[3];
p_arr_stu[0] = &arr_stu[0];
p_arr_stu[1] = &arr_stu[1];
p_arr_stu[2] = &arr_stu[2];
for (int i = 0; i < 3; i++)
modifyScore(p_arr_stu[i]);
for (int i = 0; i < 3; i++)
printf("%s的分数是%.1f\n", p_arr_stu[i]->name, p_arr_stu[i]->score);
return 0;
}
在这个示例中,我们定义了一个指针数组p_arr_stu
,数组的每个元素都是一个指向struct Student
结构体的指针。然后将arr_stu
数组中每个元素的地址分别赋给p_arr_stu
数组的每个元素。接着,我们遍历这个指针数组,并逐个调用modifyScore
函数对每个学生的分数进行修改。最后,我们再遍历一遍指针数组,输出每个学生的姓名和修改后的分数。
示例2:二维数组
我们再来看第二个示例:二维数组。假设我们需要定义一个5x5的矩阵,我们可以使用二维数组来实现:
int arr[5][5] = {
{1, 2, 3, 4, 5},
{6, 7, 8, 9, 10},
{11, 12, 13, 14, 15},
{16, 17, 18, 19, 20},
{21, 22, 23, 24, 25}
};
如果我们需要打印这个矩阵,可以使用两个嵌套的for循环来遍历。但是,如果我们需要在一个函数中操作这个二维数组,并需要使用指针来完成,我们该怎么做呢?
实际上,在C语言中,一个二维数组可以被看作是一个指针的指针。我们可以这么定义:
void printMat(int **p, int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
printf("%d ", *((int*)p + i*col + j));
printf("\n");
}
}
int main()
{
int arr[5][5] = {
{1, 2, 3, 4, 5},
{6, 7, 8, 9, 10},
{11, 12, 13, 14, 15},
{16, 17, 18, 19, 20},
{21, 22, 23, 24, 25}
};
int *p_arr[5];
for (int i = 0; i < 5; i++)
p_arr[i] = arr[i];
printMat(p_arr, 5, 5);
return 0;
}
这里我们首先定义了一个printMat
函数来打印矩阵。这个函数的第一个参数是一个指向指针的指针int **p
,表示一个二维数组,第二个参数是矩阵的行数row
,第三个参数是矩阵的列数col
。在这个函数中,我们使用两个嵌套的for循环遍历矩阵,并使用指针的方式来访问矩阵的元素。
在main
函数中,我们首先定义了一个二维数组arr
,然后定义一个指针数组p_arr
,将二维数组的每一行的地址分别赋值给指针数组的每个元素。最后,我们将指针数组p_arr
传给printMat
函数,来打印整个矩阵。
结语
通过以上的两个示例,我们可以看到,指针和数组在C语言中是非常重要的数据类型,掌握好这两个数据类型的关系,能够让我们在C语言中更加自如地进行编程。希望本文能够对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:赌你会懵的C语言指针进阶数组场景解析 - Python技术站