2010-05-01 4 views
0

Рассмотрите приведенные ниже объявления.Различные типы для декларирования переменных указателя

* появляется рядом с типом данных, а не рядом с переменной

char* ptr1, * ptr2, * ptr3; //all 3 are pointers 

* появляется рядом с переменной, а не рядом с типом данных

char *ptr1,*ptr2,*ptr3; //again all 3 are pointers 

Есть ли разница в intepretation между 2 деклараций , Я знаю, что нет никакой разницы в переменных.

В чем смысл введения указателей пустоты?

ответ

5

Единственная разница в пробеле, они в конечном итоге являются указателями на символы. Я лично использую char * ptr1, используя большое количество пробелов в моем коде.

Указатели Void могут указывать на любой тип объекта и не иметь размера. Например, это работает (но это не очень хорошая идея):

int * ptr1; 
float * ptr2; 
(*ptr1) = 17; 
ptr2 = (void*)ptr1; 

(*ptr2) теперь будет интерпретировать байты ptr1 как поплавок вместо междунар, давая вам другой результат. Вы можете менять типы. Существует несколько видов использования для void* с в typedefs от указателя к функции.

Кроме того, если у вас есть char * ptr1 и do ptr1++, вы увеличите адрес ptr1 на sizeof(char). Это невозможно с помощью void *, это даст вам ошибку компилятора, говоря, что он не знает, какой размер будет увеличиваться.

1

Указатели Void являются указателями на некоторые неизвестные данные, они могут быть отнесены к любому типу и, следовательно, не являются типичными, они могут привести к сбою вашей программы, используйте boost :: any, если есть необходимость в общем варианте.
Нет никакой разницы между декларациями.

1
  1. Единственная разница в пробеле, которая не имеет значения. * не отображается рядом с типом данных или «рядом с переменной» - вы даже можете написать char*a,*b;. Важная вещь - это уверенность. * связывается вправо, поэтому к имени переменной. Это также означает, что char* a, b; эквивалентен char (*a), b; и приведет к указателю на char a и char b, а не на два указателя. Если вам нужны два указателя, вам нужно использовать char *a, *b;, как в вашем примере.
  2. Указатель void является указателем на память без указания типа. Это полезно при написании функции, которая должна принимать различные типы данных. Например, функция библиотеки c memcpy() копирует произвольные данные. Он не заботится о данных, которые он получает. Поскольку вы не знаете, какие данные будут переданы при реализации этой функции, вам нужно использовать void*, так как в противном случае вам понадобится функция memcpy() для каждого типа (комбинации) данных. Поскольку это функция библиотеки c и c не поддерживает перегрузку функции, для этого потребуется много функций memcpy() с разными именами.
1

Указатель void представляет собой отсутствие типа данных и, следовательно, может использоваться для указания на данные любого типа. Однако, поскольку тип данных неизвестен, нет никакого способа прямого подтверждения указателя.Для этого необходимо заранее направить указатель на определенный тип данных.

Ситуации, в которых применяется указатель void: Иногда, чтобы функция принимала данные разных типов, например. int, char, double и т. д., можно использовать шаблон. (Хотя перегруженная функция является опцией, но наименее эффективным способом). Другим способом для этой цели является использование указателя void.

недействительные ИмяФункции (недействительный * Данные, типа пары) { /* на основе второго аргумента пары, разыменовать данные указателей таких, что данные может быть обработан желаемым образом. */ }

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

0

Я слышал анекдот, в котором говорится, что если вы спросите программиста на C++, они скажут вам, чтобы он поместил его слева, а программист С справа.

В конечном счете, поскольку * привязывается к переменной, а не к типу имени, то, несомненно, лучше поместить ее справа, чтобы сделать код более понятным. Однако, поскольку на C++ существует очень мало оснований для обработки исходных указателей, у меня никогда не будет проблемы.

+1

"Несомненно"? Итак, вы говорите, что программисты на С ++ делают что-то, что «несомненно» неправильно? Причина, по которой некоторые положили ее слева, это то, что она более интуитивно понятна. Это часть спецификации типа. вы создаете указатель int, а не int. В зависимости от вашей перспективы, один из вариантов является наиболее очевидно правильным. – jalf

+1

«Несомненно»! = Значительный. Я всегда положил его налево лично, хотя это не лучшая идея, но это было окончательное утверждение. – Puppy

Смежные вопросы