1. 程式人生 > >void和void*的用法總結和注意點

void和void*的用法總結和注意點

void的字面意思是空型別,void *的意思是空型別指標,void 不是一個真正的型別,我們在宣告變數的時候從來不會像下面這樣宣告:

void a;

如果我們寫了一行這樣的程式碼,某些編譯器會直接報錯,有些則不會,但也沒有任何意義。

void真正的用途在下面兩個方面:

  1. 對函式返回值的限定

  2. 對函式引數的限定

比如,函式沒有返回值,那麼函式可能會宣告成這樣:void fun(int a);

如果函式有返回值,但是函式沒有引數,那麼函式的可能會宣告成這樣:int fun(void)。

以上的情況都是很好理解的。下面介紹void *的一些用法。

1. 函式可接受任意型別的指標。

用過memset或者memcpy的細心的人會發現,在gcc中編譯類似下面的程式碼都不會有警告:

int a;

int *p = &a;

memset(p, 0, 4);

或者

char c[4];

char *p = c;

memset(p, 0, 4);

為什麼memset傳int *還是char *都沒有問題呢?我們知道不同型別間複製是要進行強制轉換的,那麼這裡為什麼不用強制型別轉換呢。我們看memset的原型會發現,memset的第一個引數就是void *。

2. void *型別可以接受任意型別指標。

例如:

void *p1;

char *p2 = "hellp";

p1 = p2;

這是沒有問題的,任何型別的指標都可以直接賦值給它,無需進行強制型別轉換。但需要注意的一點是,void *的型別並不能無需型別轉換直接賦值給其他型別,比如malloc的返回值是void *,那麼我們一般這樣寫:char *p = (char *)malloc(4);

3. void *型別不能做運算

比如我們不要做類似這樣的操作:

void *p;

p++;

說白了void並不是一個真實的變數,void可以看作一個抽象概念。

以上說法由於C標準不同,可能有部分差異,需要特殊對待,但大體就是這樣的。

相關推薦

voidvoid*的用法總結注意

void的字面意思是空型別,void *的意思是空型別指標,void 不是一個真正的型別,我們在宣告變數的時候從來不會像下面這樣宣告: void a; 如果我們寫了一行這樣的程式碼,某些編譯器會直接報錯,有些則不會,但也沒有任何意義。 void真正的用途在下面兩個

git stash 用法總結注意

git stash 用法總結和注意點 2018-09-04 18:02 by 加個小雞腿, 711 閱讀, 0 評論, 收藏, 編輯 常用git stash命令: (1)git stash save "save mes

jQuery-attr()prop()用法總結

今天遇到一個通過身份證的讀取,自動選擇性別的功能 開始用attr方法設定radio的checked屬性,radio確實被添加了checked=“checked”,但是對應的radio並沒有被選中 經過搜尋之後,發現改為prop方法便可以了,以下就總結一下了解到的關於attr()和prop

ABAP FORM引數傳遞USINGCHANGIN用法總結

ABAP中FORM引數的傳遞有以下幾種方式。  2種方式   <一>引用傳遞及用changing傳入引數,當form中該引數發生變化外部呼叫引數返回的值是form裡邊發生變化以後的值。當只按USING的方式傳遞引數時其也是按引用的方式傳遞,共享記憶體地址   <二>值

javascript中importexport用法總結.md

import import 和 require 的區別 import 和js的發展歷史息息相關,歷史上 js沒有模組(module)體系,無法將一個大程式拆分成互相依賴的小檔案,再用簡單的方法拼裝起來。這對開發大型工程非常不方便。 在 ES6 之前,社群制定了一些

localStorage sessionStorage 用法總結

localStorage 和 sessionStorage 屬性都允許在瀏覽器中儲存 key/value 鍵值對的資料。 sessionStorage 用於臨時儲存同一視窗(或標籤頁)的資料,在關閉視窗或標籤頁之後將會刪除這些資料。 localStorage 用於長久儲存

Friends and Berries URAL - 2067 (計算三共線計算的時候的注意

題目連結:https://cn.vjudge.net/problem/URAL-2067 具體思路:判斷三點共線就可以了,只有一對點能滿足,如果一對就沒有那就沒有滿足的. 在計算的時候,要注意,如果是按照斜率算的話,可以把除法轉換為乘法,防止精度的損失. 如果是按照距離算的話,一定要

ABAP引數傳遞USINGCHANGIN用法總結

ABAP中FORM引數的傳遞有以下幾種方式。   1.引用傳遞(CALL BY REFERENCE)   傳遞引數時將引數的地址(ADDRESS)傳至子程式中,也就是子程式中的引數變數與外部程式的引數變數共享地址內的值。又叫CALL BY ADDRESS,若子程

iOS中實現IAPApple Pay支付的注意

IAP開發需要的注意點在沙箱環境測試Store Kit在模擬器上無法執行,需要使用真機測試sanbox和app store內容一致,只是不執行真實的支付動作在測試的iphone上面退出itunes賬戶不能在測試的iphone手機上登入測試賬戶登入在程式中購買商品後,store

PyQt4 訊號用法總結

訊號與槽的例子 可以使用QObject.connect方法來連線訊號與槽 #! /usr/bin/env python # -*- coding: utf-8 -*- from PyQt4 import QtCore, QtGui class M

Oracle中時間日期轉化函式to_dateto_char用法總結

  在實際的工作中會經常會用到to_char()、to_date()函式來對時間、日期進行處理。 1、to_char()函式的用法  1.1、將時間日期按照指定的格式輸出,得到的是字串,而非date型別。 select sysdate,to_char(sysdate,'y

C++中stringvector用法總結

string 包含標頭檔案:#include<string> 申明名稱空間:using std::string ; 1)       初始化 string s1;   //Default initialization; s1 is an empty string

JavaScript全域性變數區域性變數的使用注意

<script type="text/javascript">        var abc=774;//全域性變數 function test(){abc=22;//變數abc如果沒有帶

java中++--的用法總結

++,–運算子的作用 自加(++)自減(–)運算 1.++:自加。對原有的資料進行+1 2.–:自減。對原有的資料進行-1 a:單獨使用: 放在運算元的前面和後面效果一樣。(這種用法

ES6模組的importexport用法總結

轉自:https://www.cnblogs.com/dupd/p/5951311.htmlES6之前已經出現了js模組載入的方案,最主要的是CommonJS和AMD規範。commonjs主要應用於伺服器,實現同步載入,如nodejs。AMD規範應用於瀏覽器,如require

Sql — CTE公用表表達式With用法總結

CTE(Common Table Expression) 公用表表達式,它是在單個語句的執行範圍內定義的臨時結果集,只在查詢期間有效。它可以自引用,也可在同一查詢中多次引用,實現了程式碼段的重複利用。 CTE最大的好處是提升T-Sql程式碼的可讀性,可以更加優雅簡潔的方

localStoragesessionStorage用法總結及其區別

html5中的Web Storage包括了兩種儲存方式:sessionStorage和localStorage。 sessionStorage用於本地儲存一個會話(session)中的資料,這些資料只有在同一個會話中的頁面才能訪問 並且當會話結束後資料也隨之銷燬。因此s

svn解決衝突revertresolved用法總結

解決版本衝突的命令。在衝突解決之後,需要使用svnresolved來告訴subversion衝突解決,這樣才能提交更新。衝突發生時,subversion會在WorkCopy中儲存所有的目標檔案版本(上次更新版本、當前獲取的版本,即別人提交的版本、自己更新的版本、目標檔案。

php函式之 Trim 用法以及使用注意

 trim      – 去除字串首尾處的空白字元(或者其他字元)  ltrim     – 刪除字串開頭的空白字元(或其他字元)  rtrim     – 刪除字串末端的空白字元(或者其他字元) 該函式區分大小寫 此函式返回字串 str 去除首尾空白字元後的結果。如

C# numericUpDown控制元件用法總結注意事項

numericUpDown控制元件在使用的過程當中,有些用法會不太一樣,下面做一總結。 1. 判斷numericUpDown的value屬性是否為空        使用過Numericupdown控制元件的童鞋初期應該都會碰到一個奇怪的問題,在刪除了控制元件裡的值之後,裡