Концепция пустого указателя в C-программировании

Значение «this» зависит от «контекста», в котором выполняется функция. Контекстом может быть любой объект или глобальный объект, т. Е. Окно.

Таким образом, семантика «этого» отличается от традиционных языков ООП. И это вызывает проблемы: 1. когда функция передается другой переменной (скорее всего, обратный вызов); и 2. когда замыкание вызывается из метода-члена класса.

В обоих случаях это устанавливается в окно.

127
задан pdoherty926 5 April 2018 в 03:39
поделиться

6 ответов

Действительно ли возможно разыменовать пустой указатель, не преобразовывая тип на языке программирования C...

Нет, void указывает на отсутствие типа, это не что-то, что можно разыменовать или присвоиться к.

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

Вы не можете только разыменовать его портативным способом, поскольку это не может быть правильно выровненное. Это может быть проблема о некоторой архитектуре как ARM, где указатель на тип данных должен быть выровненный на границе размера типа данных (например, указатель на 32-разрядное целое число должен быть выровненный на 4-байтовой границе, которая будет разыменована).

Например, чтение uint16_t от void*:

/* may receive wrong value if ptr is not 2-byte aligned */
uint16_t value = *(uint16_t*)ptr;
/* portable way of reading a little-endian value */
uint16_t value = *(uint8_t*)ptr
                | ((*((uint8_t*)ptr+1))<<8);

Кроме того, адресная арифметика с указателями с пустыми возможными указателями...

Адресная арифметика с указателями не возможна на указателях void из-за отсутствия конкретного значения под указателем и следовательно размером.

void* p = ...
void *p2 = p + 1; /* what exactly is the size of void?? */
96
ответ дан 24 November 2019 в 00:47
поделиться
void abc(void *a, int b) {
  char *format[] = {"%d", "%c", "%f"};
  printf(format[b-1], a);
}
2
ответ дан 24 November 2019 в 00:47
поделиться

Нет, это не возможно. Какой тип разыменованное значение должно иметь?

2
ответ дан 24 November 2019 в 00:47
поделиться

В C, a void * может быть преобразован в указатель на объект другого типа без явного броска:

void abc(void *a, int b)
{
    int *test = a;
    /* ... */

Это не помогает с записью Вашей функции более универсальным способом, все же.

Вы не можете разыменовать a void * с преобразованием его к другому типу указателя, поскольку разыменование указателя получает значение указанного объект. Явное void не допустимый тип так derefencing a void * не возможно.

Адресная арифметика с указателями об изменяющихся значениях указателя кратными числами sizeof указанный объекты. Снова, потому что void не истинный тип, sizeof(void) не имеет никакого значения, таким образом, адресная арифметика с указателями не допустима на void *. (Некоторые реализации позволяют его, с помощью эквивалентной адресной арифметики с указателями для char *.)

30
ответ дан 24 November 2019 в 00:47
поделиться

Я хочу сделать этот функциональный дженерик, не используя IFS; действительно ли это возможно?

Единственным простым путем я вижу, должен использовать перегрузку.. который не доступен в C, программирующем langage AFAIK.

Вы рассматривали программирование на C++ langage для Вашей программы? Или есть ли какое-либо ограничение, которое запрещает его использование?

1
ответ дан 24 November 2019 в 00:47
поделиться

Вы должны знать, что в C, в отличие от Java или C #, нет абсолютно никакой возможности успешно «угадать» тип объекта, на который указывает указатель void *. Нечто похожее на "getClass ()" просто не существует, так как нигде нет этой информации. По этой причине тип «универсального», который вы ищете, всегда сопровождается явной метаинформацией, такой как «int b» в вашем примере или строка формата в семействе функций printf.

15
ответ дан 24 November 2019 в 00:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: