2012-04-16 1 views
0

Даже после лет C, указатели все еще путают меня.Передача переменной, объявленной как указатель на функцию, такой же, как передача адреса переменной, не объявленной как указатель?

эти два те же:

int *num; 
someFunc(num) 

и

int num; 
someFunc(&num); 

Объявление переменной с * делает это указатель, & превращает переменную (кратковременно) в указатель?

ответ

2

Нет, они не то же самое. В первом случае у вас есть указатель, указывающий на случайную ячейку памяти (поскольку вы ее не инициализировали). Во втором случае указатель, полученный в someFunc, будет указывать на действительное местоположение (адрес переменной num).

+0

действительный пункт. Я старался, чтобы это было просто. после инициализации, я так понимаю, они были бы одинаковыми? – Marty

+0

Да, если вы правильно инициализируете 'int * num', тогда он будет таким же. – Naveen

+0

, так что 'int * num = 8' будет содержать адрес памяти« 8 »или будет содержать указатель на адрес памяти, на котором хранится значение« 8 »? – Marty

1

Второй передает адрес целого num, что вполне разумно. Первое пропускает все, что может быть записано в указателе num. То, что должно быть be адрес int, но в вашем примере num неинициализирован и его адрес, вероятно, указывает на мусор (в лучшем случае).

1

& не превращает переменную в указатель, ее оператор, который возвращает адрес переменной. Это, по определению, указатель. Следовательно, никакой разницы, функция someFunc получает значение указателя в любом случае (в первом случае оно получает копию значения переменной указателя, во втором случае оно получает копию возвращаемого значения operator &).

2

Они одинаковы с точки зрения вызова функции. Однако

Разница заключается ....

int num является действительным числом, который вы берете адрес. Который затем может быть помещен в указатель

int *num является указателем на int, однако с вашим кодом как есть, он не указывает на фактический int, который может удерживать значение.

так что только второй пример - рабочий код.

первый один будет работать, если ...

int x; 
int *num = &x; 
someFunc(num) 

SomeFunc будет выглядеть

void someFunc(int *blah) 
{ 
} 

так в основном int* num = &x это, что происходит, когда вы делаете вызов функции someFunc(&num) т.е. его эффективно только int* blah = &num

1

В первом случае вы объявляете num указателем на i nteger. Во втором случае num является целым числом.

К функции someFunc, в обоих случаях переданный аргумент является указателем на целое число. Итак, чтобы распечатать значение, вам нужно разыскать printf("%d\n", *num).

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

Надеюсь, что это поможет.

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