void pointer

User avatar
thinker
Уже с Приветом
Posts: 26871
Joined: 29 Aug 2000 09:01

Re: void pointer

Post by thinker »

AndreyT wrote:А функция `qsort`, как таковая, и не хочет его знать. Внутри функции `qsort` работа ведется в терминах байтов, поэтому сама функция `qsort` будет приводить все указатели к типу `char *` и выполнять адресную арифметику в терминах типа `char *`.
Это так конкретно для данной функции и поскольку мы передаем другие параметры в неё. Но если говорить в общих чертах, без привязке к конкретной функции, если void pointer передается функции,

Code: Select all

void xyz(void *base);
нужно ли приводить его к конкретному типу? Или это зависит от того, что дальше мы хотим делать внутри функции, как в случае с qsort? Похоже, что если void pointer передается (то есть, мы хотим абстрагироваться от типов), то теряется смысл его преобразовывать. Тогда уж лучше передавать сразу pointer определенного типа (например int*), а не void. Я прав?
All rights reserved, all wrongs revenged.
sergant
Уже с Приветом
Posts: 1127
Joined: 11 Apr 2004 03:28

Re: void pointer

Post by sergant »

pointer есть адрес памяти, точка отсчета. Там находятся байты. Тип указателя нужен в основном только тогда когда нам нужно манипулировать данными находящимися по "адресу в памяти". Например послать инкремент или перейти следующему елементу массива, в этом случае компилятору надо знать тип (размерность).

Code: Select all

#include <stdio.h>

void main() {
  int   *i;
  char  *c;
  float *f;
  void  *v;
  int    myvar;

  v = &myvar;
  i = v;        
  c = v;
  f = v;
  printf("v=%p,v+1=%p\n", v, v+1);
  printf("i=%p,i+1=%p\n", i, i+1);
  printf("c=%p,c+1=%p\n", c, c+1);
  printf("f=%p,f+1=%p\n", f, f+1);
}
--------------
$ ./a.out
v=0x7fff40779cdc,v+1=0x7fff40779cdd
i=0x7fff40779cdc,i+1=0x7fff40779ce0
c=0x7fff40779cdc,c+1=0x7fff40779cdd
f=0x7fff40779cdc,f+1=0x7fff40779ce0

Return to “Вопросы и новости IT”