一、理解NULL
- 定義形式
#define __DARWIN_NULL ((void *)0)
#define NULL __DARWIN_NULL
- 以上以MacOS的LLVM為例。
- NULL實際為(void *)類型,并且值為0x00
- 是指針唯一能直接賦值的字面量
二、理解sizeof函數(shù)
- 實際是運算符,不需要引入任何頭文件
unsigned long len=sizeof int;
- 它的目的:是計算表達(dá)式的結(jié)果,所占據(jù)的空間大小
#include <stdio.h>
int main() {
size_t len= sizeof(1+2.0l);
printf("%zu\n",len); //answer: 16
return 0;
}
- 計算的依據(jù): 是根據(jù)“聲明類型”的大小
#include <stdio.h>
int main() {
int mm[3]; //12byte
int *p=mm; //8byte (64位機(jī))
size_t len1= sizeof(mm);
size_t len2= sizeof(p);
printf("%zu,%zu\n",len1,len2); //answer: 12,8
return 0;
}
- 對于數(shù)組,也可以按"初始化器"
int mm[]={1,2,3}; //12byte
三、理解數(shù)據(jù)類型
- 普通數(shù)據(jù)類型:目的是為了分配固定空間大小的內(nèi)存,如: char ,short分別占1和2個字節(jié),這自然會影響到sizeof的結(jié)果。
- 數(shù)組類型:會根據(jù)元素的個數(shù),決定空間大小
- 結(jié)構(gòu)體類型:會根據(jù)聲明時元素的個數(shù)和類型進(jìn)行計算(注意:有內(nèi)存對齊的問題)
- 指針類型:無論指針是何種類型聲明,都只會根據(jù)OS的位數(shù)分配。32位機(jī)占4字節(jié)。
四、理解指針的類型
- 為什么要給指針加上類型?
是為了確認(rèn)指針操作時的內(nèi)存范圍,主要有以下三種操作:
(1)自增,自減: 按照指針的類型決定步長,如int,步長為4字節(jié)
(2)*解引用:會按照指針的類型,決定使用多大的內(nèi)存字節(jié)數(shù)
五、理解指針強制轉(zhuǎn)換
- 目的:改變指針操作時的內(nèi)存范圍
- 萬用指針類型:void *,它是C99標(biāo)準(zhǔn)用來取代char *的指針類型,用于表示,只使用用一個字節(jié)范圍的指針類型。
六、指針的指針:
- 作用:自身是一個指針,其內(nèi)容是另一個指針地址。
- 它的自增:每次按計算機(jī)位數(shù)進(jìn)行增加,如64位機(jī),增長8字節(jié)。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。