C語(yǔ)言超詳細(xì)講解宏與指針的使用
1、關(guān)于define
define是一個(gè)預(yù)處理指令,有兩種用法,一種是用define定義常量;另外一種是define定義宏。
下面的例子為利用define定義常量
#define _CRT_SECURE_NO_WARNINGS
#define MAX 1000
#include <stdio.h>
int main()
{
printf("%d\n",MAX);
return 0;
}
運(yùn)行結(jié)果為1000.
下面的例子是define定義宏
#define ADD(X,Y) X+Y
int main()
{
printf("%d\n",ADD(2,3));
return 0;
}
運(yùn)行結(jié)果為5.
將printf("%d\n",ADD(2,3));改為printf("%d\n",4*ADD(2,3));,則運(yùn)行結(jié)果為11.預(yù)期的運(yùn)行結(jié)果為4x5=20,為什么會(huì)出現(xiàn)這樣的結(jié)果呢?因?yàn)閐efine定義宏是替換,就變成了4x2+3=11了,4x2為X,Y仍然是3。如何讓其得到正確的結(jié)果20呢?在寫(xiě)宏的時(shí)候,將X與Y括起來(lái),因?yàn)閄與Y可能不是簡(jiǎn)單的數(shù)字,它可能是表達(dá)式,所以定義宏的時(shí)候應(yīng)該是這樣的定義方法:#define ADD(X,Y) (X+Y),這樣一來(lái)運(yùn)行結(jié)果就是我們所預(yù)期的結(jié)果了。
2、初識(shí)指針
(1)內(nèi)存
我們買(mǎi)回來(lái)的電腦內(nèi)存可能是4g、8g、16g,這么大的內(nèi)存空間我們?cè)撊绾稳ナ褂盟兀績(jī)?nèi)存屬于空間,內(nèi)存的使用相當(dāng)于空間的使用,與現(xiàn)實(shí)生活中空間的使用很相似?,F(xiàn)實(shí)生活中是怎么找到空間的呢?是通過(guò)地址,而地址又跟房間所關(guān)聯(lián)。比如:北京市海淀區(qū)某街道100號(hào)。
內(nèi)存是電腦上特別重要的存儲(chǔ)器,計(jì)算機(jī)中所有的程序的運(yùn)行都是在內(nèi)存中進(jìn)行的,所以為了有效地使用內(nèi)存,就把內(nèi)存劃分成一個(gè)一個(gè)小的內(nèi)存單元,每個(gè)內(nèi)存單元的大小是1個(gè)字節(jié),為了能夠有效地訪(fǎng)問(wèn)到內(nèi)存的每個(gè)單元,就給內(nèi)存單元進(jìn)行了編號(hào),這些編號(hào)被稱(chēng)為內(nèi)存單元的地址。
如下圖所示:

問(wèn)題來(lái)了,內(nèi)存是怎么編號(hào)的呢?一個(gè)這樣的內(nèi)存單元是多大空間?
對(duì)于機(jī)器來(lái)說(shuō),有32位機(jī)器,也有64位機(jī)器;32位機(jī)器指的是有32根地址線(xiàn),地址線(xiàn)就是物理線(xiàn),物理線(xiàn)是可以通電的,通電的時(shí)候電信號(hào)轉(zhuǎn)換成數(shù)字信息:正電是1,負(fù)電是0,就變成1和0組成的二進(jìn)制序列。
對(duì)于32位機(jī)器有32位地址線(xiàn),那么32位地址線(xiàn)組成的信號(hào)排列有很多很多種,多達(dá)2的32次方個(gè),這些序列都可以作為內(nèi)存的編號(hào)(從0開(kāi)始到2^32-1),我們把這些編號(hào)稱(chēng)為內(nèi)存單元的地址
00000000 00000000 00000000 00000000
…
01111111 11111111 11111111 11111111
10000000 00000000 00000000 00000000
…
11111111 1111111 111111111 111111111
一個(gè)這樣的內(nèi)存單元是多大的空間呢?
假設(shè)一個(gè)內(nèi)存單元是1bit
232=4294 967 296bit
232 /8 =536870912 byte
232 /8/1024 =524288kb
232 /8/1024/1024=512MB
232 /8/1024/1024/1024=0.5GB
實(shí)際上在32位機(jī)器的時(shí)候,2GB的內(nèi)存已經(jīng)很常見(jiàn)了。C語(yǔ)言中最小的單位是char類(lèi)型,char類(lèi)型是1byte=8bit-8個(gè)地址,有點(diǎn)浪費(fèi)地址了。最終平衡一下,一個(gè)內(nèi)存單元是一個(gè)字節(jié)的空間,然后進(jìn)一步地分配地址的。
(2)示例
int main()
{
int a = 10;//a在內(nèi)存中是要分配空間的,給a分配4個(gè)字節(jié),那么給a分配的4個(gè)字節(jié)是哪4個(gè)字節(jié)呢?
printf("% p\n", &a);//%p專(zhuān)門(mén)用來(lái)打印地址的
int* pa = &a;//pa是用來(lái)存放地址的,在c語(yǔ)言中pa是叫指針變量(取a的地址,將a的地址放到pa里面去)
//*說(shuō)明pa是指針變量,int說(shuō)明pa執(zhí)行的對(duì)象是int類(lèi)型的
return 0;
}
運(yùn)行結(jié)果為:00000054E6EFFBE4,&a拿到的是四個(gè)字節(jié)中的第一個(gè)字節(jié)的地址。
再舉個(gè)例子:
int main()
{
char ch = 'w';
char * pc = &ch;
printf("%p\n",pc);
return 0;
}
運(yùn)行結(jié)果為:
000000ACD04FF934
(3)指針的使用示例
地址如何存儲(chǔ)?需要定義指針變量
int main()
{
int num = 10;
int * p;//p為一個(gè)整型指針變量
p = #
printf("%p\n",p);
return 0;
}
00000030714FFB74
指針的使用示例:
#include <stdio.h>
int main()
{
int a = 10;
int* pa = &a;
//*pa就是通過(guò)pa里面的地址找到a,這里的*叫解引用操作符,是單目操作符
* pa = 20;
printf("% d\n" , a);
return 0;
}
//修改a的值可以不直接改a,可以通過(guò)地址來(lái)間接地改a。
運(yùn)行結(jié)果為20.修改a的值可以不直接改a,可以通過(guò)地址來(lái)間接改a。
(4)指針變量的大小
int main()
{
printf("%d\n",sizeof(char *));
printf("%d\n", sizeof(short *));
printf("%d\n", sizeof(int *));
printf("%d\n", sizeof(double *));
return 0;
}
運(yùn)行結(jié)果均為8(其它幾種類(lèi)型的指針大小也是8):
8
8
8
8
結(jié)論:指針的大小是相同的,指針是用來(lái)存放地址的,指針需要多大空間,取決于地址的存儲(chǔ)需要多大空間。指針在32位平臺(tái)是4個(gè)字節(jié),在64位平臺(tái)是8個(gè)字節(jié)。
32位機(jī)器上其實(shí)是32個(gè)比特位組成的二進(jìn)制序列,32bit=4byte
64位機(jī)器上其實(shí)是64個(gè)比特位組成的二進(jìn)制序列,64bit=8byte
到此這篇關(guān)于C語(yǔ)言超詳細(xì)講解宏與指針的使用的文章就介紹到這了,更多相關(guān)C語(yǔ)言宏與指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ Qt開(kāi)發(fā)之使用QProcess實(shí)現(xiàn)進(jìn)程管理
Qt 是一個(gè)跨平臺(tái)C++圖形界面開(kāi)發(fā)庫(kù),利用Qt可以快速開(kāi)發(fā)跨平臺(tái)窗體應(yīng)用程序,本文將重點(diǎn)介紹如何運(yùn)用QProcess組件實(shí)現(xiàn)針對(duì)進(jìn)程的控制管理等,感興趣的可以了解下2024-03-03
C語(yǔ)言實(shí)現(xiàn)掃雷游戲(含注釋詳解)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)掃雷游戲,含注釋?zhuān)闹惺纠a介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
VisualStudio2022 cmake配置opencv開(kāi)發(fā)環(huán)境
本文主要介紹了VisualStudio2022 cmake配置opencv開(kāi)發(fā)環(huán)境,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08
C語(yǔ)言中feof函數(shù)和ferror函數(shù)示例詳解
在C語(yǔ)言中feof函數(shù)用于檢查文件流的結(jié)束標(biāo)志,判斷文件在讀取時(shí)是否已經(jīng)到達(dá)了文件的末尾,這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中feof函數(shù)和ferror函數(shù)的相關(guān)資料,需要的朋友可以參考下2024-09-09
C語(yǔ)言實(shí)現(xiàn)掃雷游戲(初級(jí)版)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)掃雷游戲初級(jí)版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09

