0
what is difference?why mistake?//ответ по русский не помешает:)
int var = 50; int *p; *p = &var;//instead p=&var int var = 50;//this is valid int *p= &var; //
3 Answers
+ 8
int *p;
It's a common mistake to assume *p as the variable name. But here int * (integer pointer) is the DATA TYPE and p is the variable. That means, p is a variable which points to an integer. In other words, p holds memory address of an integer.
Remember two important concepts:
1) *p = content of the memory address which is stored in p
2) &var = memory address of var
Example:
say var = 50 and var's memory address is 202440300
p = &var; // p = 202440300
printf("%d", *p); // prints content at 202440300, that means 50
Now, let's trace your code line by line:
First code:
-------------
int var = 50;
int *p; // You're declaring p (not *p) here as an (int *) variable
*p = &var;
// content of p's held address = address of var (mistake)
If you print *p, you'll get garbage value.
p = &var; // this assignment will give you your desired output.
Second code:
----------------
int var = 50;
// declaration and initialization together
int *p= &var; // similar to int *p; p = &var;
// p = memory address of var (makes sense)
If you print *p now, you'll get 50
+ 1
Это ньюанс синтаксиса работы с указателями, который часто доставляет проблемы новичкам. Суть в том, что есть 3 отдельных случая:
1) Объявление указателя: int *p
2) Разименование указателя: *р
3) Получение адреса переменной: &а
Что в первом, что во втором случае используется символ '*'. Но его значение совсем разное. В первом случае * просто указывает, что объявляется "указатель" на int. Во втором случае * означает "значение, на которое указывает указатель", то есть операция обратная "&" - получение значения по адресу.
Разберём первый пример:
// объявить переменную var типа int
int var = 50;
// объявить указатель на int p
int *p;
// в значение, на которое указывает р, записать адрес var
*p = &var;
Здесь, в последней строке, адрес переменной var записывается в "значение", на которое указывает р, а не в сам указатель. Разименование указателя (*) здесь лишнее. Нельзя непосредственно записывать адрес в int.
Второй пример:
// объявить var типа int и инициализировать ее значением 50
int var = 50;
// объявить указатель на int p, инициализировать его адресом переменной var
int *p = &var;
Здесь все нормально. '*' в последней строке - это не разименование а просто объявление указателя.
В общем, синтаксис работы с указателями в С++ может показаться немного запутанным по началу, но с практикой, к нему привыкаешь.
+ 1
спасибо огромное♡...@Marvin
thanks a lot♡...@Shamima Yasmin