Мне было интересно, в чем разница между этими двумя строками кода?Простой вопрос C относительно *
int hi;
int *hi;
В языке программирования C?
Спасибо! Amit
Мне было интересно, в чем разница между этими двумя строками кода?Простой вопрос C относительно *
int hi;
int *hi;
В языке программирования C?
Спасибо! Amit
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
Фантастический. Именно то, что я хотел знать. Могу ли я беспокоить вас еще одним вопросом? Я видел, как указатели использовались очень широко. Зачем? Почему они так особенны? Почему некоторые предпочитают использовать указатели, а не целые числа? – Amit
Извините, не означали целые числа, означающие переменные int. – Amit
Еще один комментарий, извините. Если бы у меня было что-то вроде этого: 'int hi [4]; int * phi; phi = &hi[2]; 'Это даст phi значение третьего (с учетом 0-индекса) значения массива' hi'. Теперь можно ли это сделать без указателей? Например: «int hi [4]; int phi; phi = hi [2]; '. Разве это не сделает то же самое? Если это так, я могу теперь, наконец, понять, почему указатели полезны. – Amit
Первый объявляет целочисленную переменную, а второй объявляет указатель на целое число.
Указатели выходит за рамки на StackOverflow должности, но this Wikipedia article является отправной точкой, и должно быть по крайней мере глава на указатели в любой книге вы используете, чтобы узнать C.
a. int i;
b. int *address;
c. address = &i;
В строке объявлена целочисленная переменная с именем i
. Когда это будет сделано, компилятор резервирует объем памяти размером sizeof(int)
(это 4 байта на моем компьютере). Если вы хотите обратиться к этому пространству памяти, вам нужно использовать указатели.
Строка b объявляет переменную с именем address
, которая имеет специальное свойство. Эта переменная не содержит int
, но сохраняет адрес переменной, которая имеет тип int
. Поэтому любое значение, которое имеет значение address
, должно интерпретироваться как адрес переменной, которая имеет тип int
. В настоящее время переменная address
не содержит в ней никакого адреса памяти, поскольку мы еще не определили, какой адрес памяти этой переменной должен удерживаться.
Строка c может быть считана как «адрес равен адресу памяти переменной i
». Теперь адрес переменной хранит адрес памяти переменной int
i
.
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) и запускать несколько программ с указателями в нем и проверять каждую переменную, которую вы указали в коде. Я понимаю вещи лучше, когда у меня есть визуальная картина любой проблемы, и я думаю, что это может ускорить ваше понимание указателей.
int hi ------ указывает, что hi - это целое число, которое выделяет для него 2 байта. int * hi ------ * указывает указатель, который содержит адрес переменной, и эта переменная является целым числом. оба являются разными. Один указывает целое число, а другое указывает адрес целого.
int hi; зарезервировать место в памяти для целочисленной переменной, а int * ptr; зарезервируйте место в памяти для указателя, который содержит адрес памяти другой переменной. вы можете использовать указатели по-разному.
int *ptr = hi;
int *ptr;
ptr = &hi;
при изменении значения из PTR изменить адрес, где он указывает на, но если вы изменили значение после того, как де-ссылки на адрес, который вы меняете значение другой переменной.
*ptr = 3;
приводит к изменению значения hi;
hi
хранит значение типа целого числа в определенном месте, но
*hi
хранит адрес любого переменного типа INT.
Пример:
int hi = 10;
int *hello = &hi;
Первый - INT привет; здесь вы объявляете целочисленную переменную с именем «hi»
Then - int * hi; здесь «привет» указатель, который может указывать на целое значение
Примечание: INT * привет и ИНТ * привет синтаксически же
Спасибо за редактирование, @Frustrated ... – Amit
You может захотеть получить более глубокое понимание указателей: http://www.eskimo.com/~scs/cclass/notes/sx10b.html – FrustratedWithFormsDesigner