Указатель против переменной, Objective-C - PullRequest
5 голосов
/ 06 августа 2010

У меня есть некоторые трудности с пониманием некоторых понятий.Благодарен за помощь.

Допустим, у вас есть следующий фрагмент кода:

int *intPtr;   // creates a pointer
int count = 10; // initiates an intiger variable
intptr = &count; // ??

Оператор & дает адрес переменной, в данном случае целое число count.Адрес затем присваивается intptr.Мой вопрос: почему intptr = count; недостаточно.Я знаю, что count является переменной, а intptr является указателем, но не является ли переменная также просто ссылкой на какое-то место в памяти?

Ганс

Ответы [ 5 ]

8 голосов
/ 06 августа 2010

count относится к VALUE переменной.Вы не хотите присваивать значение count для intptr, вы хотите назначить адрес count.Таким образом, используется оператор &.

Если вы введете intptr = count, в этом случае вы будете указывать на адрес памяти 10, который обязательно будет в системной памяти, а не в памяти приложения, и выавария.

5 голосов
/ 06 августа 2010

Важно понимать, что указатели на самом деле имеют другой тип данных.

Переменная int будет содержать целочисленные значения.

Переменная pointer будет содержать адреса памяти.

Поэтому неправильно присваивать переменную int переменной-указателю (как вы предложили intptr = count;)

Я считаю, что использование typedef поможет вам лучше понять разницу.

Вот небольшой пример:

#include <stdio.h>

typedef int* int_pointer;

int main() {

    int n; // integer
    int_pointer p; // pointer

    n = 5;

    p = &n; // p's value is now n's address

    *p = *p + 1; // add 1 to the value stored at the location that p points to
                 // and put that value back in the same location

    printf("n = %d\n", n);
    printf("*p = %d\n", *p);

    return 0;
}

Эта программа напечатает

n = 6
*p = 6
1 голос
/ 06 августа 2010

Переменная - это место в памяти, тогда как указатель относится к месту в памяти (и место, к которому оно относится, со временем может измениться).

В вашем примере, если бы вы сказали intptr = count, тогда все равно было бы очевидно, что вы имели в виду (и компилятор мог бы быть написан, чтобы угадать это тоже). Однако это приведет к несоответствиям в синтаксисе, который вы можете использовать. Значение выражения называется lvalue , если оно относится к чему-либо, может быть назначено, и rvalue в противном случае. Если компилятор сделал вид «угадывания», который вы, похоже, предлагаете, то некоторые, но не все выражения типа int (а именно те, которые являются lvalues) будут автоматически превращаться в указатели. В некоторых случаях это может привести к очень запутанным сообщениям об ошибках.

0 голосов
/ 06 августа 2010

В некоторых функциях, используемых в программировании на C, Objective-C или C ++, вы должны передавать «ссылку» на значение (другими словами, указатель) в качестве параметра, а не просто переменной.

Взять этот фрагмент кода:

int count;

// Метод / функция C, используемые для чтения значений // (числовых или символьных) из командной строки.

scanf("%i", &count); 

если вы попробовали то же самое, без «&» (адреса) вы получите либо ошибку времени компиляции, либо ошибку времени выполнения (в зависимости от того, с какой системой вы работаете в Win / Linux / OSX, так как каждый компилятор будет что-то делатьнемного по-другому. [GCC, MingW и т.д ..])

Переменные используют память и остаются в памяти до завершения программы, и вы не сможете восстановить эту память до тех пор.

Где «указатель» может быть освобожден из памяти с помощью метода dealloc во время работы вашей программы, и эта память освобождается во время выполнения вашего приложения.

0 голосов
/ 06 августа 2010

Вы все еще можете сделать intptr = count, но это не достигнет того, с чем вы запутались.

Возможно, вы захотите указать указатель на адрес в памяти, и если по милости Божьей значение в счетчике является действительным адресом, то вы также можете не получить ошибку сегментации.

Конечно, каждая переменная относится к некоторому месту в памяти, но это не означает, что приравнивание двух разных типов приведет к поведению, которое можно предположить, основываясь на вышеупомянутом факте. Существует четкое определение переменной int и указатель на int.

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