Простой C вопрос относительно * - PullRequest
0 голосов
/ 12 января 2011

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

int hi;
int *hi;

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

Спасибо! Amit

Ответы [ 8 ]

8 голосов
/ 12 января 2011
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
2 голосов
/ 12 января 2011

int hi объявляет переменную hi как целое число .int *hi объявляет переменную hi как указатель на целое число.

1 голос
/ 27 ноября 2015

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

Пример:

int hi = 10;
int *hello = &hi;
1 голос
/ 12 января 2011

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

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

0 голосов
/ 12 декабря 2016

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

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

Примечание: int * hi и int * hi синтаксически одинаковы

0 голосов
/ 07 ноября 2015

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

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

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

*ptr = 3;

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

0 голосов
/ 07 ноября 2015

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

0 голосов
/ 13 января 2011

а.int i;
б.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) и запустить несколько программ с указателями в нем и проверить каждую переменную, которую вы объявили в коде.Я понимаю вещи лучше, когда у меня есть визуальная картина любой проблемы, и я думаю, что это может также ускорить ваше понимание указателей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...