簡體   English   中英

C ++取消引用void指針,將int ptr轉換為void ptr

[英]C++ dereference a void pointer , converting int ptr to void ptr

這些代碼行顯示如下錯誤:

int e = 5, * ePtr = &e;
void * vPtr = ePtr; 
cout << *vPtr; 

語法錯誤:

`void *'不是指向對象的類型

我知道:

  1. 任何指針類型都可以存儲在void指針類型中而無需顯式轉換
  2. 解除引用嘗試void指針是語法錯誤

但如果我們不能做#2點,除了語法正確之外,點#1的用途是什么? 我想用vPtr打印5(即e )這可能嗎?

這很好用:

int e = 5, * ePtr = &e;
void * vPtr = ePtr; //specific to generic Ok!
double * dPtr = (double *)vPtr; //to let compiler know stoarge size
cout << *dPtr; //indirectly it is vPtr i.e. a void ptr, can be deref only if cast

要遵循void*指針,您需要將指針強制轉換為兼容類型。

void*指針經常在C中使用,但是,因為在C ++中我們可以執行函數重載和多態,它們的使用更加有限。

在C中使用void*指針的一個很好的例子是使用回調的函數:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 
                   void *(*start_routine) (void *), void *arg);

當你調用pthread_create函數時,它會調用你的start_routine 在這種情況下,您可能希望將一些數據傳遞給start_routine 由於線程庫無法為您可能想要傳遞給回調的每種類型聲明pthread_create函數,因此使用void*類型。

void myCallBack(void* arg) {
   int* value = (int*)arg;

   /* Do something with value: it is an int* now*/
   printf("Message from callback %d\n", *value);
}


/* Some main function or whatever... */
{ 
  /*  ... */
  int foo = 123;
  ret = pthread_create(&thread, &attr,myCallBack, &foo);

  /*  ... */
}

void*可以指向任何東西,因此為它指定任何指針都非常好。

但是因為它可能指向任何東西,所以取消引用它是不可能的:編譯器不知道它指向哪個對象類型,因此根據對象的類型,它無法生成代碼來做正確的事情

你不能取消引用它,因為編譯器不知道它是什么。 您必須將其轉換為適當的類型(編譯器必須假設您知道自己在做什么)。

void *指針最適合用於與相當低級別的東西(例如I / O驅動程序)接口,在那里你很少關心你正在處理的數據,你只知道你有緩沖區和大小。

任何其他用途都充滿了危險。 例如

int i = 5;
void *p = &i;
.....
float *f = (float *)p;

這將不會出現編譯器錯誤或警告。 這完全有效。 但它不太可能達到你的預期

存儲指針並對其類型保持無關緊要可能很有用。 這就是void *的用途。 在純C中設計存儲容器(鏈表,哈希映射)時,您可以采用一種方法。

如果你想使用指針那么你必須跟蹤它的類型及其值,因為你不能隨意地引用指針,並且當你轉換為void *時所有類型信息都會丟失。

在您的示例中,您可以使用帶有void *和type字段的簡單結構。

在C ++中,您可以使用多態結構甚至模板來實現這些功能:您所做的更多是C風格。

在沒有類型轉換的情況下,您無法使用void*在此處打印e 指針不僅僅是一個存儲地址的簡單變量,但它也有一個類型,它告訴編譯器使用該地址讀取的大小。 如果沒有類型轉換,則無法取消引用void* ,因為它沒有任何類型。 通過類型轉換,您可以告訴編譯器從指針攜帶的地址開始應該讀取多少字節。

void*為程序員提供了一種輕松存儲和使用其他類型指針的簡便方法。 我們不能使用unsigned int或類似的來存儲指針的值,因為指針的大小依賴於處理器。 此外,我們可以使用void*使指針參數/函數的返回值更通用。

我的事情所以你想存儲指向void *指針的int指針。 在那種情況下,您可能會收到警告,例如“從不同大小的整數轉換為指針”。為此您首先需要指定一些與整數相關的內存void指針,然后使用該void指針可能如下,

void *ptr = malloc(sizeof(int));
*((int*)ptr) = 5;
printf("%d\n",*((int*)ptr));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM