2015-10-20 3 views
1
#include <stdio.h> 
int main(void) 
{ 
    int x[2][3] = 
    { 
    {4, 5, 2}, 
    {7, 6, 9} 
    }; 
    int (*p)[3] = &x[1]; 
    int (*q)[3] = x; 
    printf("%d %d %d\n", (*p)[0], (*p)[1], (*p)[2]); //7, 6, 9 
    printf("%d %d\n", *q[0], *q[1]); // 4, 7 
    return 0; 
} 

x [0] ----> [4, 5, 2].Адресация многомерных массивов и указателей

х [1] ----> [7, 6, 9]

так что если p=X[1], p[0]=7, p[1]=6 и p[2]=9, так что первый Printf понятно.

Для второго printf x будет равен первому элементу адреса массива. Если * q [0] равно 4, то почему * q [1] 7, не должно ли оно быть 5? Он пропускает строку.


Фактическое значение от ссылки:

 
7 6 9 
4 7 
+3

Должен ли вывод 'p' быть 7, 6 и 9, так как' p' указывает на * второй * массив в 'x'? Пожалуйста, отредактируйте вопрос, чтобы включить * фактический * вывод (скопированный и вставленный) из фактической программы, отображаемой в вопросе. –

+0

@JoachimPileborg Я также получил это: http://ideone.com/QPp5xd – 0605002

+0

вы правы, извините исправлено. Набрал неверный ряд, но вопрос стоит. – chefcurry7

ответ

1

Сравните эти две строки:

printf("%d %d %d\n", (*p)[0], (*p)[1], (*p)[2]); //7, 6, 9 
printf("%d %d\n", *q[0], *q[1]); // 4, 7 

В первой строке вы разыменовано указатель первого, а затем доступ к индексу - в вашей второй строке вы недостающие скобки. Изменение его на:

printf("%d %d %d\n", (*p)[0], (*p)[1], (*p)[2]); // 7, 6, 9 
    printf("%d %d %d\n", (*q)[0], (*q)[1]); // 4, 5 

Будет выдавать значения, как вы ожидаете.

0

он указывает на второй массив в х.

Если вы хотите получить все элементы первой строки, вы можете использовать что-то вроде этого.

#include <stdio.h> 
int main(void) 
{ 
int x[2][3] = 
{ 
{4, 5, 2}, 
{7, 6, 9} 
}; 
int (*p)[3] = &x[1]; 
int (*q)[3] = x; 
printf("%d %d %d\n", (*p)[0], (*p)[1], (*p)[2]); //4, 5, 2 
printf("%d %d %d\n", *q[0], q[0][1],q[0][2]); // 4, 5,2 
return 0; 
} 
0

Выход, который вы получаете, действителен.

*q[1] равнозначно q[1][0]. И поэтому значение при этом индексе равно 7, которое вы получаете как выход.

Чтобы получить 5, вы можете написать вот так: q[0][1] или другим способом представить (*q)[1].

0

Это проблема приоритета оператора. [] имеет более высокий приоритет, чем унарный *. Если к указателю массива применяется [], он будет выполнять арифметику указателя по тем же правилам, что и для обычных указателей.

Для любого типа указателя, ptr[i] равно *(ptr + i) и ptr+i означает «дать мне адрес ptr плюс i*sizeof(*ptr) байт.

Так что в вашем случае q[1] означает» дать мне адрес q + 1*sizeof(*q), где содержание q - это массив из 3 целых чисел. Таким образом, вы в конечном итоге указываете на начало второго массива.