Разница в указателях между int * val = otherVal и int val = otherVal - PullRequest
0 голосов
/ 14 декабря 2018

Я немного запутался и попытался найти объяснение, но все вопросы о "разнице" касаются type *name против type* name, на который я знаю ответ.

У меня есть такой код:

int a = 1;
printf("a = %d", a); // Prints 1

int *pt = a;
printf("pt = %d", pt); // Prints 1

*pt = 2; // Crash why? What am i pointing to here?
&pt = 2; // Not even compiling since 
pt = 2; // Works

printf("pt = %d\n", pt); // Prints 2
printf("a = %d\n", a); // Prints 1

Я знаю, чтобы изменить значение a, я должен был сделать int *pt = &a, а затем *pt = 2, и это не мой вопрос.

В этом случае мой вопрос использует int *pt = a то же самое, что и использование int pt = a или есть ли преимущество в использовании его в качестве указателя?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018
int a = 1;
...
int *pt = a;

Пытается сохранить значение 1 в качестве адреса , удерживаемого указателем pt.Любое разыменование pt гарантировано для SegFault, поскольку address 1 находится в самом низу диапазона зарезервированной системы памяти, к которому у вас нет возможности доступа, что приводит к нарушению доступа и SegFault.

Что такое указатель?

Указатель - это просто обычная переменная, которая содержит адрес чего-то еще в качестве значения.Другими словами, указатель указывает на адрес, где можно найти что-то еще.Если вы обычно думаете о переменной, содержащей непосредственные значения, такие как int a = 5;, указатель будет просто содержать адрес, где 5 хранится в памяти, например, int *b = &a;.Он работает одинаково независимо от типа объекта, на который указывает указатель.Он может работать таким образом, потому что type указателя управляет арифметикой указателя, например, с указателем char *, указателем pointer+1 на следующий байт для указателя int * (обычное 4-байтовое целое число), pointer+1 будет указывать на следующее int со смещением на 4 байта после pointer.(так что указатель, это просто указатель .... где арифметика автоматически обрабатывается type)

Так что в вашем случае:

int a = 1;
...
int *pt = &a;

Назначит адрес, где a сохраняется в памяти для переменной указателя pt.Затем вы можете получить доступ к значению по этому адресу, разыменовав pt (например, *pt)

0 голосов
/ 14 декабря 2018

То, что вы делаете, - это установка адреса, на который указывает указатель pt, на то, что a удерживает в данный момент (1 в вашем случае).Поскольку *a определенно не является действительным и доступным адресом, вы, скорее всего, получите ошибку сегментации при попытке разыменования его.Это примерно то же самое, что если вы создаете нулевой указатель с помощью int *pt = 0, но вместо 0 вы используете все, что находится в.

Имейте в виду, что при преобразовании со знаком int, вероятно, происходит нечто прикольноепо адресу, который только усугубляет ситуацию.

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