2013-05-14 8 views
-8

Поэтому у меня есть следующий код до сих пор:2d массивы указателей

#include <stdio.h> 

int foo (int *pointer, int row, int col); 

int main() { 
    int array[3][3] ={ {1,2,3},{4,5,6},{7,8,9}}; 

    int *pointer= array[0]; 

    int row = 2; 
    int col = 2; 

    int answer = foo (pointer, row, col); 

    printf("%d", answer); //prints 5 (which is wrong) 
    printf("%d", array[2][2]); //prints 9 
} 

int foo (int *pointer, int row, int col){ //I don't want to use any square brackets here, unless I really have to. 
    int value; 
    value = *((int *)(pointer+row)+col); 

return value; 
} 

Так что мой главный вопрос с переходом 2D-указатель, пожалуйста, подробно объяснить, как я еще новичок в кодировании. Я не хочу, чтобы действительно изменить то, что я передаю (как я хочу использовать указатель в Foo (указатель, строка, столбец) и не Foo (массив, строка, столбец).

+0

@Dayalrai А что, а? Все, что я могу сказать об этом, это то, что это ужасно неправильно и усиливает вред «массивы - это указатели». – 2013-05-14 09:13:06

+0

@Dayalrai Вы ошибаетесь в том, что используете многомерные массивы и двойные указатели взаимозаменяемо, а это не так. – 2013-05-14 09:16:48

+1

почему вы удалили вопрос. Поместите эту фразу как commanet и не удалите свой исходный вопрос – MOHAMED

ответ

1
int *pointer= array[0]; 

Вместо использовать этот

int *pointer= &array[0]; 

Или

int *pointer= array; 
+0

Кто отказался от этого, серьезно? Это хороший ответ. +1. – 2013-05-14 09:18:31

+0

Я не спускал вниз, но я тоже не продвигался, потому что этот ответ немного освещает объяснение продемонстрированных образцов кода. – StoryTeller

+0

@StoryTeller Да, но ИМХО, что не стоит нисходящего. – 2013-05-14 09:20:52

3

пропусканием 2D указатель

Из того, как вы (ab) использовали терминологию, совершенно ясно, что вы ошибаетесь в том, что указатели и массивы одинаковы. They aren't.

Если вы хотите получить доступ к многомерный массив с помощью указателей, вы должны указать все его размеры (за исключением первого, внутреннего одного) и использовать арифметику указателей правильно, возможно использование указателей-на-массиве, так как многомерные массивы являются смежными в памяти:

const size_t h = 2; 
const size_t w = 3; 
int arr[h][w] = { 
    { 1, 2, 3 }, 
    { 4, 5, 6 } 
}; 

int *p = &arr[1][2]; 
int *q = arr[1]; 
int (*t)[3] = &arr[1]; 
printf("arr[1][2] == %d == %d == %d\n", *p, q[2], (*t)[2]); 

return 0; 
Смежные вопросы