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語言中fscanf和fprintf
寫的權限 set per efi errno fclose pri form price 很多時候我們需要寫入數據到文件中時都覺得很困擾,因為格式亂七八槽的,可讀性太差了,於是我們就想有沒有什麽函數可以格式化的從文件中輸入和輸出呢,還真有。下面我將講解一下fscanf和fp
C語言中typedef和sizeof的註意事項
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語言中malloc和remalloc函式的分析
首先申明,這是本人第一次寫部落格,其目的僅僅是為了加強自己對知識點的掌握,為到達在本子上記筆記的效果 進入正題。對於malloc,它的作用就是為了動態分配空間,像c++中的new一樣。這裡就不說他們兩的區別了。malloc函式有這樣幾個特點。 1.分配的空間地址是連續的,
C語言中scanf(),sscanf(),fscanf()的用法和區別
scanf(),sscanf(),fscanf()區別: 第一個是從控制檯(鍵盤)輸入; 第二個是從字串輸入; 第三個是從檔案輸入; scanf scanf()函式根據由format(格式)指定的格式從stdin(標準輸入)讀取,並儲存資料到其它引數. int main
c語言中static和auto的區別
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語言中printf和scanf函式基本的引數型別和輸出形式
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語言中const和C++中const關鍵字的區別
# include "iostream" using namespace std; struct Teacher { char name[30]; int age; }; void operatorTeacher(Teacher *pT) {
由淺至深->C語言中union和enum關鍵字的經典問題分析
引言:由淺至深系列的第二篇文章,繼續體悟語言中的一些細節! 文章嚮導 union的自我介紹 union與系統大小端 enum列舉的引入 真正意義上的常量? 正文 一、union的自我介紹 union(聯合/共用體)在語
C語言中typedef和define的區別
正確思考typedef和巨集文字替換直接的區別關鍵在於就是把typedef看成一種徹底的“封裝”型別——在宣告它之後不能在裡面增加別的東西。它和巨集的區別主要體現在兩個方面。 一、可以用其他型別說明符對巨集型別名進行擴充套件,但對typedef所定義的型別名卻不