2016-09-11 3 views
-5

// Объяснить вывод этого кода, в частности, не может понять, последний выход PRINTF ... Пожалуйста, объяснитеОбъясните вывод этой программы этого кода?

int a1[]={6,7,8,18,34,67}; 
int a2[]={23,56,28,29}; 
int a3[]={-21,27,-31}; 
int *x[]={a1,a2,a3}; 

void print(int *a[]) 
{ 
    printf("%d",a[0][2]); // outputs 8 
    printf("%d",*a[2]); //outputs -21 
    printf("%d",*++a[0]); //outputs 7 
    printf("%d",*(++a)[0]); //outputs 23 
    printf("%d",a[-1][+1]); /*outputs 8 explain?*/ 

} 

main() 
{ 
    print(x); 
    return(0); 
} 
+0

Почему это путает? –

+0

Обратите внимание на позицию 'a' после операций приращения, а отрицательный индекс может ввести в заблуждение, но он будет штрафом, если только он не получит доступ из связанного индекса. _Note: index не применяется к массиву 'a1',' a2', 'a3', а к массиву указателей_. – ameyCU

+0

, пожалуйста, объясните '1-1 + sqrt (45 * 45) -45' Этот код - только утренний утренний эксперимент. Не очень полезно. –

ответ

0

Помните, что является указателем на указатель и может быть изменен, не тот же объект, что и массив x, он просто указывает на первый элемент этого массива. То же самое верно для элементов массива x: x [0], x [1] и x [2] являются указателями на первые элементы массивов a1, a2, a3.

Перед последней строкой printf указатель a указывает на второй элемент массива x, который является указателем на массив a2. Причиной этого является четвертая строка printf, которая увеличивает указатель a на единицу.

Затем мы переходим к последней строке printf.

Первый индекс [-1] уменьшает указатель a, результат теперь указывает на первый элемент массива x, который является указателем на массив a1. Разница дает значение этого указателя. Из-за третьей строки printf этот указатель указывает на второй элемент массива a1.

Второй индекс [1] извлекает третий элемент массива a1.

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