C: обработка столбцов двумерного массива - PullRequest
0 голосов
/ 17 марта 2020
#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,1,2,3,4 из столбцов строки 0, но у меня были эти результаты

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

Я пытался найти, что было не так, но мне не удалось ....

Я буду благодарен, если кто-то объяснит, что не так с моими кодами ..

Ответы [ 3 ]

1 голос
/ 17 марта 2020

Ваше назначение в l oop инициализирует начальную диагональ:

(*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;
0 голосов
/ 17 марта 2020
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
}
}

Должен ли я написать вложенный l oop для распечатки всех элементов 2D?

Есть ли способ распечатать, используя 1 l oop с обработкой столбцов 2D-массива?

0 голосов
/ 17 марта 2020

Я думаю, что вы хотите написать свой for l oop как этот (на основе ваших подписей) для первой строки.

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

Здесь увеличение указателя p не помогает поскольку он будет увеличиваться на значение NUM_COLS каждый раз из-за арифметики указателя c.

Вот второй возможный ответ, если вы хотите записать и прочитать всю матрицу в пределах одной для l oop

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

Или лучшим решением было бы использовать два для циклов как

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

Спасибо за вопрос:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...