📜  C测验– 108 |问题4(1)

📅  最后修改于: 2023-12-03 15:30:15.278000             🧑  作者: Mango

C测验- 108 |问题4

该问题是关于C语言中的数组和指针的知识点。在C语言中,数组和指针是紧密相关的,因为数组的名称本质上就是指向数组首元素的指针。

数组和指针的区别

数组和指针都可以用来引用内存中的一系列元素,但它们有以下区别:

  • 数组的大小是固定的,不能改变;指针可以指向不同的内存地址,因此可以改变指向的对象。
  • 数组的名称是常量,不能被赋值;指针可以被重新赋值。
  • 数组和指针在内存中的存储方式不同。数组会占用一整块内存空间,而指针只占用4个或8个字节的空间,用来保存地址。
如何使用数组和指针
声明和初始化

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;
}

需要注意的是,在定义函数参数时,二维数组的列数不能省略,因为需要确定每一行的元素个数以便于计算。