【问题标题】:C : Processing the columns of a 2D arrayC:处理二维数组的列
【发布时间】:2020-03-17 02:35:44
【问题描述】:
#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 新手,我想了解如何处理二维数组的列。

我想从第 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

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

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

【问题讨论】:

  • 尝试用int a[NUM_ROWS][NUM_COLS] = {{0}};初始化数组,循环结束后,打印整个数组看看循环做了什么。
  • 我做到了,但我只得到了 0 0 0 0 0
  • 这不是整个数组。整个数组有 15 个条目。
  • 我发布了另一个代码你会在下面看到答案吗?

标签: c arrays pointers multidimensional-array


【解决方案1】:

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

(*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;

【讨论】:

    【解决方案2】:

    我认为您想像这样编写for 循环(根据您的字幕) 第一行。

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

    这里增加指针p 并没有帮助,因为指针运算每次都会增加NUM_COLS 的值。

    如果您想在单个 for 循环中写入和读取整个矩阵,这是第二种可能的答案

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

    或者更好的解决方案是使用两个 for 循环作为

    for (p = &a[0], i = 0; p < &a[NUM_ROWS] ; p ++) {
        int k = 0; //for the column count
        for(;k < NUM_COLS; i++, k++) {
            (*p)[k] = i;
        }
    }
    

    感谢您的提问:)

    【讨论】:

    • 如果您想完全解析二维矩阵而不仅仅是第一行,请在 cmets 中提问,我也会编辑我的答案来回答这个问题:)
    【解决方案3】:
    for (p = &a[0]; p < &a[NUM_ROWS]; p++){
    for(i=0;i<NUM_COLS;i++){
        (*p)[i]=i;
        printf("%d\n",(*p)[i]); 
    // I got 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4
    }
    }
    

    我应该编写嵌套循环来打印出所有二维元素吗?

    有没有办法使用 1 个循环来处理二维数组的列?

    【讨论】:

      猜你喜欢
      • 2014-07-13
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-20
      相关资源
      最近更新 更多