📅  最后修改于: 2023-12-03 15:30:15.278000             🧑  作者: Mango
该问题是关于C语言中的数组和指针的知识点。在C语言中,数组和指针是紧密相关的,因为数组的名称本质上就是指向数组首元素的指针。
数组和指针都可以用来引用内存中的一系列元素,但它们有以下区别:
C语言中声明数组的格式为:数据类型 数组名[数组大小]
。可以在声明时同时初始化数组,例如:
int a[5] = {1, 2, 3, 4, 5}; // 定义一个有5个整数的数组并初始化
指针的声明格式为:数据类型 *指针变量名
。指针需要指向一个具体的内存地址,可以使用地址运算符&
获取变量的地址,并将其赋值给指针变量,例如:
int x = 10;
int *p = &x; // 定义一个指针并将其指向变量x的地址
数组和指针都可以用下标运算符[]
来访问元素,例如:
int a[5] = {1, 2, 3, 4, 5};
int x = a[2]; // 访问数组a的第3个元素,即3
指针也可以使用下标运算符来访问指向的对象。由于指针指向的是内存地址,因此需要使用解引用运算符*
来访问指向地址的内容,例如:
int x = 10;
int *p = &x;
int y = *p; // 访问p指向的内存地址中的内容,即10
指针还支持指针运算,包括指针加法和指针减法。指针加法表示将指针向后移动一定的距离,指针减法表示将指针向前移动一定的距离,例如:
int a[5] = {1, 2, 3, 4, 5};
int *p = a; // 将指针p指向数组a的首元素
int x = *(p + 2); // 访问p向后移动2个元素后所指向的内存地址中的内容,即3
int y = *(p - 1); // 访问p向前移动1个元素后所指向的内存地址中的内容,即未定义行为
注意:指针减法只有在两个指针指向同一个数组内的元素时才有意义。如果指向不同的内存地址,则行为未定义。
本题的问题是给定一个二维数组a,试编写一个函数来计算每行最大元素的和。
首先,需要明确二维数组在内存中的存储方式。二维数组实际上是一个一维数组的数组,即a[i][j]可以表示为*(*(a+i)+j)
,其中a+i
表示指向第i行的指针,*(a+i)+j
表示指向第i行第j列的元素的指针,*(*(a+i)+j)
表示该元素的值。
因此,可以使用一个for循环来遍历每一行,内嵌一个for循环来遍历该行的每一个元素,找到最大值并累加。代码如下:
int row_sum(int a[][3], int row) {
int sum = 0;
for (int i = 0; i < row; i++) {
int max = a[i][0];
for (int j = 1; j < 3; j++) {
if (a[i][j] > max) {
max = a[i][j];
}
}
sum += max;
}
return sum;
}
int main() {
int a[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int sum = row_sum(a, 3);
printf("%d\n", sum); // 输出18
return 0;
}
需要注意的是,在定义函数参数时,二维数组的列数不能省略,因为需要确定每一行的元素个数以便于计算。