2013-10-02 4 views
0

Я пытаюсь использовать указатели для обработки 2D-массива в виде массива 1D (так как это так, как я понял в памяти). Я думал, что у меня это есть, тогда я понял, что добавляю только значение ASCII 'a' (и печать abcdefghijkl вместо abcghidefjkl).Использование указателей для доступа к двумерному массиву линейно

Как я могу переписать заявление printf для печати abcghidefjkl? Кроме того, как я могу сделать это с Интс и парном (то есть - с помощью data2 и Data3)

int main() 
{ 

int i = 0; 
char data[4][3] = { {'a','b','c'},{'g','h','i'},{'d','e','f'},{'j','k','l'}}; 
int data2[4][3] = { {1,2,3},{7,8,9},{4,5,6},{10,11,12}}; 
double data3[4][3] = { {1,2,3},{7,8,9},{4,5,6},{10,11,12}}; 

for(i=0;i<12;i++) 
{ 
printf("%c\n", **(data)+i*sizeof(char)); 
} 

return 0; 
} 

Спасибо!

+0

Вы пробовали * (base + i * 3 + j)? i для строки и j для столбца. Может быть * (base + i * 3 * sizeof (type) + j * sizeof (type)) –

+0

Нет. Я пытаюсь избежать использования «j» и использовать указатели, чтобы рассматривать его как 1D-массив. – user2839180

ответ

0

изменить одну строку из вас код

#include "stdio.h" 

    int main() 
    { 

    int i = 0; 
    char data[4][3] = { {'a','b','c'},{'g','h','i'},{'d','e','f'},{'j','k','l'}}; 
    int data2[4][3] = { {1,2,3},{7,8,9},{4,5,6},{10,11,12}}; 
    double data3[4][3] = { {1,2,3},{7,8,9},{4,5,6},{10,11,12}}; 

    for(i=0;i<12;i++) 
    { 
    printf("%c\n", *(*data +i)); // here is the change 
    } 

    return 0; 
    } 
+0

Не так ли sizeof (char)? Потому что, когда я пытаюсь использовать data2 или data3 и sizeof (int)/sizeof (double) соответственно, он выплескивает мусор. Если я удалю sizeof(), он будет работать как ожидалось для всех типов. – user2839180

+0

Да, компилятор позаботится об этом. Для случая sizeof (char) это '1'. поэтому не имеет значения. –

+0

Это имеет смысл! Так как расширение, как я могу передать data2 в другую функцию (назовем это doStuff()) и поместим там цикл printf? – user2839180

0

Да, следующий массив находится в пределах одного блока памяти в самом деле:

char data[4][3] = { {'a','b','c'},{'g','h','i'},{'d','e','f'},{'j','k','l'}}; 

, таким образом, вы способны лечить любым способом, вам нравится, пока вы пытаетесь получить доступ к элементам, находящимся в пределах диапазона этого массива. Простой арифметический указатель, как это будет делать:

int i; 
char* ptr = &data[0][0]; 
for(i = 0; i < 12; i++) 
    printf("%c ", *(ptr + i)); 

но это будет выводить a b c g h i d e f j k l. Для того, чтобы сделать это a b c d e f g h i j k l вам, вероятно, придется прийти с чем-то более сложным, например:

int i,j; 
char* ptr = &data[0][0]; 
// a b c d e f: 
for(i = 0; i < 2; i++) 
    for (j = 0; j < 3; ++j) 
     printf("%c ", *(ptr + i*6 + j)); 
// g h i j k l: 
for(i = 0; i < 2; i++) 
    for (j = 0; j < 3; ++j) 
     printf("%c ", *(ptr + i*6 + j + 3)); 

отмечают, что это гарантировано стандартом, который sizeof(char) всегда будет возвращать 1, таким образом, он может быть опущен. В случае массива int s код должен будет содержать всего 2 изменения: ptr должен быть объявлен как int*, а printf должен использовать спецификатор %d. Вам все равно не придется использовать sizeof.

Смежные вопросы