[英]C++ dereference a void pointer , converting int ptr to void ptr
這些代碼行顯示如下錯誤:
int e = 5, * ePtr = &e;
void * vPtr = ePtr;
cout << *vPtr;
語法錯誤:
`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.