int main()
{
int b = 12;
void *ptr = &b;
printf("%d", *ptr);
return 0;
}
我希望此代碼列印 12,但它沒有。如果我們定義 int 指標而不是 void 指標,它將起作用。我想知道我們如何使用 void 指標并列印分配給它的地址以及保存在其中的金額?
uj5u.com熱心網友回復:
取消參考 avoid *沒有意義,因為它無法知道它指向的記憶體型別。
您需要強制轉換為指向 a 的指標int *,然后取消參考它。
printf("%d", *((int *)ptr));
uj5u.com熱心網友回復:
void 指標不能被取消參考。它會給出這個警告
編譯器錯誤:“void ”不是指向物件型別的指標*
所以,你必須這樣做。
#include<stdio.h>
int main()
{
int b = 12;
void *ptr = &b;
printf("%d", *(int *)ptr);
return 0;
}
uj5u.com熱心網友回復:
void 指標何時有用的教科書示例是qsort.
這是簽名:
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
base只是指向第一個元素的指標。它是空指標的原因是因為 qsort 可用于任何串列,而不管型別如何。nitems是串列中的專案數 (doh),size是每個元素的大小。到目前為止沒有什么奇怪的。
但它也需要第四個引數,它是一個函式指標。您應該撰寫一個自定義比較函式并將指標傳遞給該函式。這就是qsort能夠對任何串列進行排序的原因。但是因為它應該是通用的,所以它需要兩個空指標作為引數。下面是這樣一個比較函式的例子,為了清楚起見,它有點臃腫:
int cmpfloat(const void *a, const void *b) {
const float *aa = (float*) a;
const float *bb = (float*) b;
if(*aa == *bb) {
return 0;
} else if(*aa > *bb) {
return 1;
} else {
return -1;
}
}
很清楚發生了什么。如果 a>b 則回傳正數,如果它們相等則回傳零,如果 b>a 則回傳負數,這是要求。實際上,我只是這樣寫:
int cmpfloat(const void *a, const void *b) {
return (*(float*)a - *(float*)b));
}
你用它做什么是這樣的:
float arr[5] = {5.1, 3.4, 8.9, 3.4, 1.3};
qsort(arr, 5, sizeof *arr, cmpfloat);
也許說使用void指標代替模板、泛型函式、多載函式等并不完全準確,但它們有相似之處。
uj5u.com熱心網友回復:
如果p有 type void *,則運算式*p有 type void,這意味著“沒有值”。不能將通過void運算式來printf為%d轉換指定符(或任何其他轉換說明)。
為了取消參考 a void *,您必須首先將其轉換為適當型別的指標。您可以使用演員表來做到這一點:
printf( "%d\n", *(int *) ptr );
或將其分配給適當型別的指標:
int *p = ptr;
printf( "%d\n", *p );
圍繞void指標的規則很特殊,因此它們可以在沒有顯式轉換的情況下分配給其他指標型別 - 這允許它們用作“通用”指標型別。但是,您不能直接檢查void指標指向的事物。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/327462.html
上一篇:如何關閉/清除IPC訊息佇列?
下一篇:realloc因指標陣列而失敗
