首页 > 解决方案 > C:处理二维数组的列

问题描述

#include<stdio.h>
#define NUM_ROWS 3
#define NUM_COLS 5

int main(void){ 

int a[NUM_ROWS][NUM_COLS],(*p)[NUM_COLS], i;

for (p = &a[0],i=0; p < &a[NUM_ROWS]; p++,i++){
(*p)[i]=i;
}
printf("The value of a[0][0] is %d\n",a[0][0]); // I want 0
printf("The value of a[0][1] is %d\n",a[0][1]); // 1
printf("The value of a[0][2] is %d\n",a[0][2]); // 2
printf("The value of a[0][3] is %d\n",a[0][3]); // 3
printf("The value of a[0][4] is %d\n",a[0][4]); // 4

return 0;
}

大家好,我是 C 新手,我正在尝试了解如何处理 2D 数组的列。

我想从第 0 行的列中输出 0、1、2、3、4,但我得到了这些结果

The value of a[0][0] is 0
The value of a[0][1] is 0
The value of a[0][2] is 1
The value of a[0][3] is 0
The value of a[0][4] is -1

我试图找出问题所在,但我没有......

如果有人解释我的代码有什么问题,我将不胜感激。

标签: carrayspointersmultidimensional-array

解决方案


您在循环中的分配是初始化前导对角线:

(*p)[i] = i;

为了说明,这是您的代码的改编版,它打印整个矩阵(并对其进行初始化):

#include <stdio.h>
#include <string.h>

#define NUM_ROWS 3
#define NUM_COLS 5

int main(void)
{
    int a[NUM_ROWS][NUM_COLS], (*p)[NUM_COLS], i;

    /* Set all elements to -1 assuming 2's complement */
    memset(a, 0xFF, sizeof(a));

    for (p = &a[0], i = 0; p < &a[NUM_ROWS]; p++, i++)
    {
        (*p)[i] = i;
    }

    for (i = 0; i < NUM_ROWS; i++)
    {
        for (int j = 0; j < NUM_COLS; j++)
            printf("%3d", a[i][j]);
        putchar('\n');
    }

    return 0;
}

输出是:

  0 -1 -1 -1 -1
 -1  1 -1 -1 -1
 -1 -1  2 -1 -1

请注意,前对角线上的三个元素设置为 0、1、2,其余为 -1,由 设置memset()

如果要初始化第一行,则只需使用:

 int (*p)[NUM_COLS] = &a[0];
 for (int i = 0; i < NUM_COLS; i++)
     (*p)[i] = i;

或者,更简单地说,忘记p并使用:

for (int i = 0; i < NUM_COLS; i++)
    a[0][i] = i;

如果要初始化第 0 列,则需要:

(*p)[0] = i;

或者,更简单地说,忘记p并使用:

for (int i = 0; i < NUM_ROWS; i++)
    a[0][i] = i;

推荐阅读