關於void*型別的用法(目前自己所能想到的)
1.C++語言在對於void* 型別的使用很特別,因為void* 可以間接引用任何其他資料型別的指標,比如int*、float*甚至抽象資料型別的指標,而且可以從void* 強制轉換為任何其他資料型別的指標,所以使用起來有時候會比較危險。如果開始將一個void*的指標間接引用一個float*的指標,然後將這個void*指標強制轉化為一個int*型別的指標,編譯器不會給出錯誤甚至警告,但是輸出的資料卻匪夷所思,如果再強制轉換會float*則不會出現任何問題;
在後來發現,C++語言中(使用vs2005)任何資料型別的指標型別都可以互相強制轉化(我想應該是因為不同指標都是地址,每種資料型別的引用都具備相同位數的緣故),如果強制轉化為不同的資料型別之後再強制轉換回來則不會又任何問題,如果強制轉換為其他的資料型別進行運算,則資料不會是預料之中那樣的;
void main(){
float f = 1.34f;
float* pFloat = &f;
void* pVoid = pFloat;
int* pInt = (int*) pVoid;
*pInt = 1;
float* fp = (float*)pVoid;
cout << pFloat << endl;
cout << fp <<" "<< *fp << endl;
cout << pInt << " " << *pInt << endl;
}
最後輸出的結果三個指標所指向的地址空間都是相同的,但是輸出的資料卻大不相同(我想應該是各種資料型別在儲存時候資料格式不一樣的緣故)。所以在寫程式的時候儘量不適用void*型別進行資料操作。
2.但是在進行程式設計的時候,比如設計一個通用介面,在引數列表中有指標資料型別,但是在真正適用這個介面的時候並不知道每一次具體傳入的會是哪種資料型別的指標,所以設計這個引數的時候就可以設計為void* 型別的引數,在使用的時候每次傳進來一個需要的資料型別的指標,因為void*可以間接引用任何資料型別的指標;之後在函式實現的內部再將這個傳入的指標由void*型別強制轉換為本來所需要的資料型別的指標進行解析和使用即可,感覺在MFC的自動生成的介面中很多都採用了這種設計方式。
相關推薦
關於void*型別的用法(目前自己所能想到的)
1.C++語言在對於void* 型別的使用很特別,因為void* 可以間接引用任何其他資料型別的指標,比如int*、float*甚至抽象資料型別的指標,而且可以從void* 強制轉換為任何其他資料型別的指標,所以使用起來有時候會比較危險。如果開始將一個void*的指標
SSM 動態切換資料來源 (目前自己的專案正在用,超詳細,保證可用)
目錄 五、測試 一、jdbc.properties 檔案 兩個資料庫,這裡使用的postgresql 資料庫 jdbc.driver=org.postgresql.Driver #���ݿ��ַ jdbc.url=
Hdu 2243 考研路茫茫——單詞情結 (AC自己主動機+矩陣)
單詞 spa 主動 efi scanf 考研 max 數量 define 哎喲餵。中文題。。。不說題意了。 首先做過POJ 2778能夠知道AC自己主動機是能夠求出長度為L的串中不含病毒串的數量的。 POJ 2778的大概思路就是先用全部給的病毒串建一個AC自己主動
每日總結-05-19(AC自己主動機結束)
tom www 最大 else bfs dna trie樹 mage val 今天下午討論了一下校賽的題,最終最終拍板,把校賽的題目定下來了。 然後今天A掉了4個AC自己主動機的題目。最終完畢了AC自己主動機專輯裏面的15個題。至此AC自己主動機全然結束。 明天開啟線段
nodejs express session用法(含保存到redis)
name pre bsp -s save ini 兩個 普通 expr 普通用法: 1 var express = require(‘express‘); 2 var session = require(‘express-session‘); 3 4 var a
重要的轉變(感覺自己最近墮落必讀)
時間 size 語言 span 維基 自己 積極 實現 自己的 轉變之前的我: 只會C語言,編個基礎的二叉樹都難實現,遞歸更是連想都想不起來了。 我只是上課聽聽老師講的,項目混混,不吸收新知識。 有閑暇時間(比如上午只有兩節課,那麽剩下的兩節課就是閑暇時間,還有
600集Python從入門到精通教程(懂中文就能學會)
元組 單繼承 查詢 字符串 屬性 linux系統 事件 集成 tar 目錄大綱: 本套教程15天 1-3 天內容為Linux基礎命令 4-13 天內容為Python基礎教程 14-15 天內容為 飛機大戰項目演練 視頻概括: 第一階段(1-3天):
詳解MySQL中concat函數的用法(連接字符串)
連接 container 使用方法 字符串 border IT 冗余 str () MySQL中concat函數 使用方法: CONCAT(str1,str2,…) 返回結果為連接參數產生的字符串。如有任何一個參數為NULL ,則返回值為 NULL。
前端mv框架下(目前寫的是vue),對組件抽象的思考
復用 問題 一個 基礎 ant case 思維 這一 情況 前沿: 抽象是門大學問。前端mv框架中,以組件化的概念為主。經常會考慮抽象到組件級別,進行復用。合理的抽象,能提高效率,減少業務邏輯視圖的耦合程度。不合理的抽象,則會增加代碼的復雜程度。 遇到的問題 合理
Linux下Dockerfile搭建lnmp(目前只有n和p)
docker# 一:環境準備centos7.4以及搭建好的Docker [root@node01 ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core)[root@node01 ~]# docker -vDocker version
影像采集-拍照 (用自己的插件 )簡單邏輯
random spl 客戶 edit 點擊 asc chan bytes wid 1. 加載插件 camera.js 加載的插件是攝像頭插件 image.js 加載的是圖像插件 ??????????????? 2.把插件的el 加載到要插入的dom元素中,
代理伺服器的原理及用法(解決上網時間限制問題)
解決公司限制上網時間問題 一、代理伺服器原理【Proxy Serve】: 代理伺服器就類似代理商,如圖,假設你的機器為A機,你想獲得的資料由B機提供,代理伺服器為C機,那麼具體的連線過程是這樣的: 首先,A機需要B機的資料,它與C機建立連線,C機接收到A機的資料請求後,與B
jQuery中map和each的用法(jquery-1.12.1.js)
無意間看到一道奇葩的面試題:(大家猜猜執行結果) ["1","2","3"].map(parseInt); //[1, NaN, NaN] 看到執行結果執行結果,你是怎麼想的呢?猜對了麼?反正我是沒有!還是js小菜鳥的我,看傻眼了,這是什麼鬼?結果不應該是[1, 2, 3]麼?百
java獲得當前(或輸入所需年份)年、月、周的日曆
package com.dmap.plantimer.controller.api; import java.util.*; import java.text.SimpleDateFormat; public class CalendarAoo { public static void
Java種的基本資料型別轉換(自動、強制、提升)
Java種的8大基本資料型別,以及它們所佔記憶體大小和範圍 1、自動型別轉換 自動型別轉換是指:數字表示範圍小的資料型別可以自動轉換成範圍大的資料型別。 如: long l = 100; int i = 200; long ll = i; 具體自動轉換如如下圖所示:
2.6 使用for迴圈遍歷檔案 2.7 使用while迴圈遍歷檔案 2.8 統計系統剩餘的記憶體 2.9 資料型別轉換計算(計算mac地址) 3.0 資料型別轉換(列表與字典相互轉換)
2.6 使用for迴圈遍歷檔案 open r:以只讀方式開啟 w: 以寫方式開啟 a: 以追加模式開啟 r+: 以讀寫模式開啟 w+: 以讀寫模式開啟(參見w) a+: 以讀寫模式開啟(參見a) rb: 以二進位制模式開啟 read 我們先寫一個檔案,叫1.txt 內容如下 111 22
TestFlight用法(iOS APP官方測試工具)
TestFlight用法(iOS APP官方測試工具) 參考資料: TestFlight用法 包教包會(iOS APP官方測試工具) TestFlight使用之外部測試 包教包會(iOS APP官方測試工具) Missing Compliance in Sta
C++強制型別轉換(dynamic_cast,static_cast, const_cast, reinterpret_cast)
[toc] C++同時提供了4種新的強制型別轉換形式(通常稱為新風格的或C++風格的強制轉 型):const_cast(expression)、dynamic_cast(expression)、 reinterpret_cast(expression)和 st
BZOJ 4552 [Tjoi2016&Heoi2016]排序(二分答案 + 線段樹)(給自己始終如一的提醒)
在說二分之前,我覺得這道題ai的值域是<= n ,這不是就聯想到權值線段樹/樹狀陣列了嗎?(事實上也確實有這樣的做法) 不過因為這是我聽二分課的例題就果斷二分了 如果二分答案的話,我們定義b[i] , 且a[i] > mid則b[i] = 1 ,否
Linux程式設計:一、入門(建立自己的靜態庫)
專案檔案最終的樹目錄,生成目標程式後,可以刪除中間檔案 note:靜態庫以lib開頭 ,比如mylib.a 靜態庫缺點:很多程式使用一個函式庫的函式時,會產生很多個副本。 共享庫.so可以解決此問題。 建立自己的函式,放在不同的標頭檔案中,只定義不宣告,並用gcc編譯 /