2011-01-12 2 views
0

Мне было интересно, в чем разница между этими двумя строками кода?Простой вопрос C относительно *

int hi; 
int *hi; 

В языке программирования C?

Спасибо! Amit

+0

Спасибо за редактирование, @Frustrated ... – Amit

+2

You может захотеть получить более глубокое понимание указателей: http://www.eskimo.com/~scs/cclass/notes/sx10b.html – FrustratedWithFormsDesigner

ответ

8
int hi; 

резервы пространство для int в памяти, и каждый раз, когда вы ссылаетесь на hi, вы либо читаете, либо записываете непосредственно, что int в памяти.

int *hi; 

оставляет пространство для pointer к int в памяти, каждый раз, когда hi используется, указатель чтения или записи. Это значит, что вы не, работающий с int, только указатель на int - там должно быть int где-нибудь для указателя, чтобы ссылаться на что-то работоспособное. Например,

int hi; 
int *phi; 
phi = &hi; // phi references the int hi 
*phi = 3; // set `hi` to 3 
+0

Фантастический. Именно то, что я хотел знать. Могу ли я беспокоить вас еще одним вопросом? Я видел, как указатели использовались очень широко. Зачем? Почему они так особенны? Почему некоторые предпочитают использовать указатели, а не целые числа? – Amit

+0

Извините, не означали целые числа, означающие переменные int. – Amit

+0

Еще один комментарий, извините. Если бы у меня было что-то вроде этого: 'int hi [4]; int * phi; phi = &hi[2]; 'Это даст phi значение третьего (с учетом 0-индекса) значения массива' hi'. Теперь можно ли это сделать без указателей? Например: «int hi [4]; int phi; phi = hi [2]; '. Разве это не сделает то же самое? Если это так, я могу теперь, наконец, понять, почему указатели полезны. – Amit

2

int hi объявляет переменную hi integer. int *hi объявляет переменную hi равной pointer целым числам.

1

Первый объявляет целочисленную переменную, а второй объявляет указатель на целое число.

Указатели выходит за рамки на StackOverflow должности, но this Wikipedia article является отправной точкой, и должно быть по крайней мере глава на указатели в любой книге вы используете, чтобы узнать C.

0

a. int i;
b. int *address;
c. address = &i;

В строке объявлена ​​целочисленная переменная с именем i. Когда это будет сделано, компилятор резервирует объем памяти размером sizeof(int) (это 4 байта на моем компьютере). Если вы хотите обратиться к этому пространству памяти, вам нужно использовать указатели.

Строка b объявляет переменную с именем address, которая имеет специальное свойство. Эта переменная не содержит int, но сохраняет адрес переменной, которая имеет тип int. Поэтому любое значение, которое имеет значение address, должно интерпретироваться как адрес переменной, которая имеет тип int. В настоящее время переменная address не содержит в ней никакого адреса памяти, поскольку мы еще не определили, какой адрес памяти этой переменной должен удерживаться.

Строка c может быть считана как «адрес равен адресу памяти переменной i». Теперь адрес переменной хранит адрес памяти переменной inti.

int main(){ 
    int a; 
    int &b; 
    b=&a; 
    a=10; 
    return 0; 
} 

Когда этот код выполняется с помощью отладчика я вижу:

a = 10 // the variable's value 
b = 0x7fffffffe2fc // this is the address at which 'a' is stored. 

Указатели являются очень мощными, и вы начнете использовать его чаще, как только вы его понимаете. Помимо материалов, которые другие предложили вам прочитать, я предлагаю использовать отладчик (gdb) и запускать несколько программ с указателями в нем и проверять каждую переменную, которую вы указали в коде. Я понимаю вещи лучше, когда у меня есть визуальная картина любой проблемы, и я думаю, что это может ускорить ваше понимание указателей.

0

int hi ------ указывает, что hi - это целое число, которое выделяет для него 2 байта. int * hi ------ * указывает указатель, который содержит адрес переменной, и эта переменная является целым числом. оба являются разными. Один указывает целое число, а другое указывает адрес целого.

0

int hi; зарезервировать место в памяти для целочисленной переменной, а int * ptr; зарезервируйте место в памяти для указателя, который содержит адрес памяти другой переменной. вы можете использовать указатели по-разному.

int *ptr = hi; 
int *ptr; 
ptr = &hi; 

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

*ptr = 3; 

приводит к изменению значения hi;

1

hi хранит значение типа целого числа в определенном месте, но
*hi хранит адрес любого переменного типа INT.

Пример:

int hi = 10; 
int *hello = &hi; 
0

Первый - INT привет; здесь вы объявляете целочисленную переменную с именем «hi»

Then - int * hi; здесь «привет» указатель, который может указывать на целое значение

Примечание: INT * привет и ИНТ * привет синтаксически же

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