2016-01-17 3 views
0

Привет, У меня возникли проблемы с объявлением двухмерных массивов с помощью указателей. Я новичок в C.Как объявить двумерные массивы с помощью указателей?

int main(){ 

    int x = 0; 
    int y = 0; 

    int *xdim; 
    int *ydim; 


    printf("Enter x:\n"); 
    scanf("%d", &x); 
    printf("Enter y:\n"); 
    scanf("%d", &y); 

    xdim = &x; 
    ydim = &y; 

    char sq[xdim][ydim]; 

    return 0; 
} 

Я хочу два dimentionial массива обугленного кв.м для хранения значений занесены пользователем. Я получаю ошибку нецелого типа * int. Я также новичок в указателях.

+0

Ребята извините за мой ответ. Я с ума сошел, работая с dll. Извините @Anonymous Penguin мой ответ был неправильным ... –

+1

Просто используйте 'char sq [x] [y];', вам не нужен xdim/ydim – Ctx

+0

@Ctx он просто хочет проверить, как работают указатели. Используйте 'char sq [* xdim] [* ydim]' –

ответ

1

Использование VLA с (которые разрешены в C99, или как расширение во многих компиляторов), все, что вам нужно сделать, это:

int xdim, ydim; 
scanf("%d %d", &xdim, &ydim); 

char vla_array[xdim][ydim]; 

Как вы можете видеть, нет необходимости для указателей.


Второй вариант - использовать «обычные» массивы. Вы должны объявить массив с достаточно большим размером, и использовать только его часть:

#DEFINE X_MAX_DIM 100 
#DEFINE Y_MAX_DIM 100 

char vla_array[X_MAX_DIM][Y_MAX_DIM]; 

int xdim, ydim; 
scanf("%d %d", &xdim, &ydim); 
// check xdim and ydim are acceptable sizes 

// from now on you use up to `xdim x ydim` of your array, even if 
// it was declared as `100x100` 

Вы можете использовать это только тогда, когда вы знаете заранее максимально допустимые размеры вашего массива.


3-й вариант - использовать динамическое распределение. Это единственный вариант, если массив очень большой. Однако это продвинутая тема, поэтому вы не будете иметь дело с этим прямо сейчас.

+0

Вам не нужно упоминать VLA, как будто они что-то необычное.Они являются основной частью C. OP использует C, поэтому они могут использовать VLA. Если они не могут использовать VLA, они должны указать, что они используют C89, или компилятор, который решил использовать параметр no-VLA, * not * pure C. (* Not * предоставление VLA разрешенным расширением. , предполагается, что они разрешены.) – Leushenko

+0

@ Леушенко Я думаю, что я был довольно ясен, когда принимаю VLA. – bolov

+0

@ Леушенко Использование VLA по-прежнему остается выбором, например, их следует избегать для огромных массивов. – Quentin

0

изменение char sq[xdim][ydim]; до char sq[*xdim][*ydim];, иначе вы передадите местоположение значения, а не самого значения.
Но в этом случае нет необходимости использовать указатели, вы можете просто использовать x и y.

0

В коде вы посеяли ошибку произошло потому, что в этом объявлении

char sq[xdim][ydim]; 

там используются указатели xdim и ydim вместо целых чисел. Вы можете написать

char sq[*xdim][*ydim]; 

Хотя нет необходимости использовать указатели таким образом.

Если ваш компилятор поддерживает массивы переменной длины, то можно, например, просто написать

int main(void) 
{ 
    size_t m = 0; 
    size_t n = 0; 

    printf("Enter x:\n"); 
    scanf("%zu", &m); 
    printf("Enter y:\n"); 
    scanf("%zu", &n); 

    if (!m || !n) return 1; 

    char sq[m][n]; 

    //...  

    return 0; 
} 

В противном случае вы должны выделить массивы динамически. Например,

#include <stdlib.h> 

int main(void) 
{ 
    size_t m = 0; 
    size_t n = 0; 

    printf("Enter x:\n"); 
    scanf("%zu", &m); 
    printf("Enter y:\n"); 
    scanf("%zu", &n); 

    if (!m || !n) return 1; 

    char **sq = malloc(m * sizeof(char *)); 

    for (size_t i = 0; i < m; i++) sq[i] = malloc(n * sizeof(char)); 

    //... 

    for (size_t i = 0; i < m; i++) free(sq[i]); 
    free(sq); 

    return 0; 
} 
0

Я считаю, что если я понимаю, что вы просите об этом, это должно сработать.

Использование одного указателя в 2D-массиве;

#include <stdio.h> 
#include <stdlib.h> 
int x = 0, y = 0; 
char *arr = (char *)malloc(x * y * sizeof(int)); 
Смежные вопросы