Я видел много разных способов написания адреса оператора (&) и оператор косвенности (*)
Если я не ошибаюсь, это должно быть так:
//examples
int var = 5;
int *pVar = var;
cout << var << endl; //this prints the value of var which is 5
cout << &var << endl; //this should print the memory address of var
cout << *&var << endl; //this should print the value at the memory address of var
cout << *pVar << endl; //this should print the value in whatever the pointer is pointing to
cout << &*var << endl; //I've heard that this would cancel the two out
Что произойдет, если, например, вы написали &var
как & var
с пробелом между двумя? Общий синтаксис, который я видел: char* line = var;
, char * line = var;
, а также char *line = var;
,
во-первых, int *pVar = var;
это неверно; это не хранит адрес var
, но он хранит адрес «5», что приведет к ошибке компиляции:
main.cpp: In function 'int main()': main.cpp:9:15: error: invalid conversion from 'int' to 'int*' [-fpermissive] int *pVar = var; ^~~
var
должны быть ссылки в инициализации *pvar
:
int *pVar = &var;
во-вторых, cout << &*var << endl;
также приведет к ошибке при компиляции, потому что var
не указатель (int*
) тип переменной:
main.cpp: In function 'int main()': main.cpp:19:13: error: invalid type argument of unary '*' (have 'int') cout << &*var << endl; //I've heard that this would cancel the two out ^~~
Теперь, чтобы ответить на ваш вопрос, добавив пробел между ссылками (&
) оператор и указатель (*
) оператор не будет иметь абсолютно никакого значения для компилятора. Единственный раз, когда это имеет значение, это когда вы хотите разделить 2 токена; лайк const
а также string
например. Выполнение следующего кода просто для того, чтобы преувеличить пример того, что вы спрашиваете:
cout << & var << endl;
cout << * & var << endl;
cout << *pVar << endl;
Дает те же результаты, что и в коде без стольких пробелов:
0x7ffe243c3404
5
5
Других решений пока нет …