2017-02-15 22 views
1

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

#include <stdio.h> 
int main(){ 
    int ids[3] = {100,200,300}; 
    int *salary, salary1, salary2, *salary3; 
    salary1 = ids[0] * ids[1]; 
    salary = &ids[1] ; 
    salary2 = *(ids+1)* *(ids+2); 
    salary3 = ids+2; 
    printf("*salary = %d\nsalary1 = %d\n", *salary, salary1); 
    printf("salary2 = %d\nsalary3 = %p\n", salary2, salary3); 
} 

Я немного запутался в этом коде. Во-первых, в строке 4:

int *salary, salary1, salary2, *salary3; 

Почему звездочка в начале salary3 если звездочка уже используется в начале строки?

Во-вторых, когда он говорит:

salary1 = ids[0] * ids[1]; 

, как мы должны определить значение salary1, когда мы не знаем значение ids[1]?

+1

«*» относится только к переменной сразу после нее, а не ко всем переменным в строке. – Barmar

+0

Потому что это не 'int * зарплата' и т. Д., А' int * зарплата' и т. Д. '*' Квалифицирует переменную, а не тип. –

ответ

2

Почему есть звездочка в начале зарплаты3, если в начале строки была использована звездочка?

Звездочка означает, что следующая переменная является указателем. Это то же самое, что и:

int *salary; 
int salary1; 
int salary2; 
int *salary3; 

но на одной строке.

Как мы должны определять стоимость зарплаты1, когда мы не знаем значения идентификаторов [1]?

Но вы знаете значение идентификаторов [1]. Это 200.

+0

Я знаю значение id [0], которое равно 2000, но не ids [1] –

+0

@ShoaibAhmed no, 'ids [0]' равно 100. Посмотрите на массив 'int ids [3] = {100,200,300};' который определяет 'ids [0]' как 100, 'ids [1]' как 200, 'ids [2]' как 300. –

+0

oh мой плохой, я пропустил эту часть. Спасибо, что указали это. –

1

Во-первых, C синтаксис декларации немного запутанным

int *x, y; 

Средства х представляет собой указатель на межд, у является внутр. Это такой путаница, что практически каждый стиль руководства запрещает его.

Этот

int ids[3] = {100,200,300}; 

объявляет массив. ids [0] = 100, идентификаторы [1] = 200, идентификаторы [2] = 300. Только реально можно подстроить индексы к содержимому массива глазом, когда массивы малы. Так что это не нормальное использование массивов. Либо у вас есть большие таблицы только для чтения в глобальной памяти, либо вы создаете массив во время выполнения и заполняете его. Однако не должно быть проблемы, так это ids [1], в которой содержится 200, так как синтаксис C массива работает.