1. 程式人生 > >C語言中的void和void*的定義及用法

C語言中的void和void*的定義及用法

void

void最常見的用法,就是在函式中限定函式的引數和返回值的 void draw(void); 表明函式draw沒有引數也沒有返回值,void在別的的地方的應用我也沒見過;

實際上,如果把void 和int,char,double等型別放到一起理解的話,首先還是那句揭示本質的話:變數型別就是固定大小記憶體塊的別名,那麼void佔用多大記憶體呢,編譯器並沒有定義void佔用多大記憶體,所以對於void var; 這樣的定義,編譯器自然是不允許的,在vs中的錯誤提示是:不允許使用不完整的型別。

void*

相比於void,void *就更加有意義一些。void *是一個指標型別,指標變數都佔4byte記憶體(4byte=32 bit=2^32=4G,所以4byte就足以指向任何的記憶體地址了),所以對於void *p=NULL; 這樣的定義,編譯器可以為p分配記憶體,那麼,如此定義的p有什麼作用呢?

int *a=NULL;

p=a;

double *b=NULL;

p=b;

char c[16]={0};

p=c;

void* 就像一張白紙,任何型別的指標都可以直接賦值給void *型別的指標;

但是反過來

int *a=NULL;

a=p;//err

a=(int *)p;//需要強制型別轉換

這樣轉過來轉過去有何意義?

典型應用

void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );

memcpy和memset對外接收任何型別的指標,這樣是合理並且必要的,因為這是記憶體操作函式,是對bit進行操作的,考慮資料型別是沒有任何意義的(越觸及本質,越抽象,也越有包容性)。

int *a=NULL;

a=(int *)malloc(sizeof(int));

同樣的,malloc函式只關注你要多大的記憶體,你需要把它怎麼劃分是你的事情,但是你需要顯式的表明你是怎麼劃分的。這裡語法要求是必須的,void *型別轉為其他型別必須強制型別轉換。

相關推薦

C言中getopt()getopt_long()函式的用法

一、命令列引數的使用 C程式的主函式有兩個引數,其中,第一個引數是整型,可以獲得包括程式名字的引數個數,第二個引數是字元陣列指標或字元指標的指標,可以按順序獲得命令列上各個字串引數。其原形是: int main(int argc, char *argv[]);或者是:in

C言中,利用巨集定義一個字串字元陣列定義的字串其末尾都會自動新增\0字元

#include <stdio.h> #define MYPHONE "AT+CMGS" unsigned char SMS[]="HELLO, WELCOME TO RCCTS!"; unsigned char *String; unsigned char i=0; void main() {

C言中的const、extern結構體、聯合體的定義

分析過程: A、 首先,看變數名"next", 並注意到它直接被括號所括住; B.1、所以先把括號裡的東西作為一個整體,得出“next 是一個指向 ...的指標"。 B、 然後考慮括號外面的東西,在星號字首和括號字尾之間做出選擇。 B.2、規則告訴我們優先順序較高的是右邊的函式括號,所以得出”next是一個函

c言中fscanffprintf

寫的權限 set per efi errno fclose pri form price 很多時候我們需要寫入數據到文件中時都覺得很困擾,因為格式亂七八槽的,可讀性太差了,於是我們就想有沒有什麽函數可以格式化的從文件中輸入和輸出呢,還真有。下面我將講解一下fscanf和fp

C言中typedefsizeof的註意事項

isp sizeof spa 註意 list數據 對象 audio 應該 user typedef的作用是給一個數據類型起一個別名。 typedef struct LIST { int data; }SeqList; SeqList 就相當於struct LIS

C言中 malloc free

from:http://blog.sina.com.cn/s/blog_af1a77fa0102xceb.html 一、malloc()和free()的基本概念以及基本用法: 1、函式原型及說明: void *malloc(long NumBytes):該函式分配了NumBytes個位元

關於c言中mallocremalloc函式的分析

首先申明,這是本人第一次寫部落格,其目的僅僅是為了加強自己對知識點的掌握,為到達在本子上記筆記的效果 進入正題。對於malloc,它的作用就是為了動態分配空間,像c++中的new一樣。這裡就不說他們兩的區別了。malloc函式有這樣幾個特點。 1.分配的空間地址是連續的,

C言中scanf(),sscanf(),fscanf()的用法區別

scanf(),sscanf(),fscanf()區別: 第一個是從控制檯(鍵盤)輸入; 第二個是從字串輸入; 第三個是從檔案輸入; scanf scanf()函式根據由format(格式)指定的格式從stdin(標準輸入)讀取,並儲存資料到其它引數.   int main

c言中staticauto的區別

1、static變數存放在靜態儲存區,在程式整個執行期間都不釋放;而auto變數存放在動態儲存區,隨著生命週期的結束而立即釋放。 2、static變數只賦值一次,以後就不用賦值;而auto變數在函式每呼叫一次都要賦初值

關於C言中“x++”“++x”的問題

關於一個變數在不同環境下自增自減的問題。 #include<stdio.h> int main() { int x = 8; int y = 0; y = (++x) + (x++) + (++x); printf("%d\n",y);

C言中printfscanf函式基本的引數型別輸出形式

printf函式的引數型別和輸出形式 字元 引數型別 輸出形式 d,i int 十進位制數 o int 無符號八進位制數(不含前導0) x,X int 無符號十六進位制數(沒有前

C言中“指標”“指標變數”的區別是什麼

比較嚴格的說法是這樣的:系統為每一個記憶體單元分配一個地址值,C/C++把這個地址值稱為“指標”。如有int i=5;,存放變數i的記憶體單元的編號(地址)&i被稱為指標。“指標變數”則是存放前述“地址值”的變數,也可以表述為,“指標變數”是存放變數所佔記憶體空間“

C言中i++++i的區別

C語言中i++和++i的區別 C語言中++i和i++是有區別的!快速理解的話就是用一句話概括: 1、i++是先賦值再運算+1; 2、++i是先運算+1再賦值; i++和++i都是c語言裡的自增,但是它們自增的順序不同。++i表示,i自增1後再參與其它運算,而i++ 則是i參與運算後,i的

C言中char*char[]用法區別分析

本文例項分析了C語言中char* 和 char []的區別。分享給大家供大家參考之用。具體分析如下: 一般來說,很多人會覺得這兩個定義效果一樣,其實差別很大。以下是個人的一些看法,有不正確的地方望指正。 本質上來說,char *s定義了一個char型的指標,它只知道所指向的

C言中char * char []的區別

問題引入: 在實習過程中發現了一個以前一直預設的錯誤,同樣char *c = "abc"和char c[]="abc",前者改變其內容程式是會崩潰的,而後者完全正確。 程式演示: #include <iostream> usingnamespa

c言中get()函式的原理返回值

首先要記住的一句話就是Never use gets(). 這是因為gets()函式不檢查目標陣列是否能夠容納輸入,而若想把一個字串讀到程式中,最先要做的事情就是預留儲存字串的空間。所以這很容易導致分配的空間不夠大而陣列越界,然而gets()函式並不檢查這個方面,所以導致的結

C言中的32個關鍵字部分講解

說起c語言中的關鍵字,大家印象最深的可能就是int,double等定義一個數據變數時所使用的關鍵字了。但是除了這些資料型別的關鍵字還有哪些呢?for?while?沒錯,這些確實都是,但是並沒有一個系統的總結。本文筆者就將就c語言學習中所遇到的共計32個關鍵字進行整理。請善用搜

C言中constC++中const關鍵字的區別

# include "iostream" using namespace std; struct Teacher {     char name[30];     int age; }; void operatorTeacher(Teacher *pT) {   

由淺至深->C言中unionenum關鍵字的經典問題分析

引言:由淺至深系列的第二篇文章,繼續體悟語言中的一些細節! 文章嚮導 union的自我介紹 union與系統大小端 enum列舉的引入 真正意義上的常量? 正文 一、union的自我介紹   union(聯合/共用體)在語

C言中typedefdefine的區別

    正確思考typedef和巨集文字替換直接的區別關鍵在於就是把typedef看成一種徹底的“封裝”型別——在宣告它之後不能在裡面增加別的東西。它和巨集的區別主要體現在兩個方面。    一、可以用其他型別說明符對巨集型別名進行擴充套件,但對typedef所定義的型別名卻不