Рубрики

пустой указатель в C / C ++

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

int a = 10;

char b = 'x';

  

void *p = &a;  // указатель void содержит адрес int 'a'

p = &b; // пустой указатель содержит адрес символа 'b'

Преимущества пустых указателей:
1) malloc () и calloc () возвращают тип void *, и это позволяет использовать эти функции для выделения памяти любого типа данных (только из-за void *)

int main(void)
{

    // Note that malloc() returns void * which can be 

    // typecasted to any type like int *, char *, ..

    int *x = malloc(sizeof(int) * n);

}

Обратите внимание, что вышеуказанная программа компилируется в C, но не компилируется в C ++. В C ++ мы должны явно вернуть тип malloc в (int *).

2) указатели void в C используются для реализации обобщенных функций в C. Например, функция сравнения, которая используется в qsort () .

Некоторые интересные факты:
1) указатели void не могут быть разыменованы. Например, следующая программа не компилируется.

#include<stdio.h>

int main()

{

    int a = 10;

    void *ptr = &a;

    printf("%d", *ptr);

    return 0;

}

Выход:

Compiler Error: 'void*' is not a pointer-to-object type 

Следующая программа компилируется и работает нормально.

#include<stdio.h>

int main()

{

    int a = 10;

    void *ptr = &a;

    printf("%d", *(int *)ptr);

    return 0;

}

Выход:

10

2) Стандарт C не допускает арифметику указателей с пустыми указателями. Однако в GNU C это допускается с учетом того, что размер void равен 1. Например, следующая программа компилируется и нормально работает в gcc.

#include<stdio.h>

int main()

{

    int a[2] = {1, 2};

    void *ptr = &a;

    ptr = ptr + sizeof(int);

    printf("%d", *(int *)ptr);

    return 0;

}

Выход:

2

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

Ссылки:
http://stackoverflow.com/questions/20967868/should-the-compiler-warn-on-pointer-arithmetic-with-a-void-pointer
http://stackoverflow.com/questions/692564/concept-of-void-pointer-in-c-programming

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

Рекомендуемые посты:

пустой указатель в C / C ++

0.00 (0%) 0 votes