我在理解這段代碼時遇到了一些麻煩。
double F(double k,void *params){
double *p=(double *)params;
return p[0];
}
我只有一個來自類的指標的小概念,我知道在函式中他使用指標 *params 作為引數。我也明白他使用 double *p 來宣告變數。我想不通的是 (double *)params 做了什么,或者 p 是如何變成向量的。
uj5u.com熱心網友回復:
該運算式的(double *)params意思是“將其params視為指向double而不是指向的指標void”。這(double *)是一個演員表。
在大多數情況下,如果沒有顯式強制轉換,您無法將一種型別的指標值復制到不同型別的指標變數(您不能double *為int *變數賦值)。
C 中的一個例外是將void *值分配給不同的指標型別,反之亦然 - 在這種特殊情況下,轉換是不必要的。但是,C 不允許隱式轉換void *為其他指標型別,因此在該語言中必須進行強制轉換。
指向不同型別的指標不必具有相同的大小和表示形式;唯一的規則是
char *并void *具有相同的大小和對齊方式;- 指標限定型別具有相同的尺寸和取向為指標到不合格的當量(例如,
const int *和volatile int *具有相同的尺寸和取向為int *); - 指向所有
struct型別的指標具有相同的大小和對齊方式; - 指向所有
union型別的指標具有相同的大小和對齊方式;
uj5u.com熱心網友回復:
(double *)params指示編譯器僅在處理此運算式時將params(它最初是一個空指標 - 編譯器不知道它指向什么型別)作為指向 double 的指標。它通常被稱為“一種型別到另一種型別的 C 風格轉換”。在這種情況下,我們從一個型別“轉換”到一個型別,因為我們將它存盤在指向 double 的指標中。paramsvoid*double*double *p
如果沒有強制轉換,編譯器很可能會給你一個type mismatch錯誤/警告,因為你會試圖將一個 void 指標的值存盤到一個指向 double 的指標中。
更具體地講,當你有一個雙指標,或指向任何東西,除了無效,編譯器相關聯,以便能夠執行它的一些指標運算就可以了,當你喜歡寫東西(ptr )。例如,當( ptr)處理一個指向 double 的指標時,編譯器知道要增加多少位元組,因為它知道 double 的大小。但是,void * 沒有與之關聯的大小,因此編譯器無法對其執行指標運算。因此,當使用 將 void 指標轉換為雙指標時(double*)params,您允許編譯器將型別變數的標準大小double與此 void 指標指向的任何內容相關聯只有在處理此運算式時,才能將其值存盤在指向 double 的實際指標中。編譯器讀完這個運算式后,又回想params是一個空指標,而不是一個雙指標,即轉換為雙指標的效果不是永久的,它只在編譯器處理這個運算式的程序中有效.
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/371821.html
下一篇:將temp與結構和指標一起使用
