<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
define是一個預處理指令,有兩種用法,一種是用define定義常數;另外一種是define定義宏。
下面的例子為利用define定義常數
#define _CRT_SECURE_NO_WARNINGS #define MAX 1000 #include <stdio.h> int main() { printf("%dn",MAX); return 0; }
執行結果為1000.
下面的例子是define定義宏
#define ADD(X,Y) X+Y int main() { printf("%dn",ADD(2,3)); return 0; }
執行結果為5.
將printf("%dn",ADD(2,3));
改為printf("%dn",4*ADD(2,3));
,則執行結果為11.預期的執行結果為4x5=20,為什麼會出現這樣的結果呢?因為define定義宏是替換,就變成了4x2+3=11了,4x2為X,Y仍然是3。如何讓其得到正確的結果20呢?在寫宏的時候,將X與Y括起來,因為X與Y可能不是簡單的數位,它可能是表示式,所以定義宏的時候應該是這樣的定義方法:#define ADD(X,Y) (X+Y)
,這樣一來執行結果就是我們所預期的結果了。
我們買回來的電腦記憶體可能是4g、8g、16g,這麼大的記憶體空間我們該如何去使用它呢?記憶體屬於空間,記憶體的使用相當於空間的使用,與現實生活中空間的使用很相似。現實生活中是怎麼找到空間的呢?是通過地址,而地址又跟房間所關聯。比如:北京市海淀區某街道100號。
記憶體是電腦上特別重要的記憶體,計算機中所有的程式的執行都是在記憶體中進行的,所以為了有效地使用記憶體,就把記憶體劃分成一個一個小的記憶體單元,每個記憶體單元的大小是1個位元組,為了能夠有效地存取到記憶體的每個單元,就給記憶體單元進行了編號,這些編號被稱為記憶體單元的地址。
如下圖所示:
問題來了,記憶體是怎麼編號的呢?一個這樣的記憶體單元是多大空間?
對於機器來說,有32位元機器,也有64位元機器;32位元機器指的是有32根地址線,地址線就是物理線,物理線是可以通電的,通電的時候電訊號轉換成數位資訊:正電是1,負電是0,就變成1和0組成的二進位制序列。
對於32位元機器有32位元地址線,那麼32位元地址線組成的訊號排列有很多很多種,多達2的32次方個,這些序列都可以作為記憶體的編號(從0開始到2^32-1),我們把這些編號稱為記憶體單元的地址
00000000 00000000 00000000 00000000
…
01111111 11111111 11111111 11111111
10000000 00000000 00000000 00000000
…
11111111 1111111 111111111 111111111
一個這樣的記憶體單元是多大的空間呢?
假設一個記憶體單元是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
實際上在32位元機器的時候,2GB的記憶體已經很常見了。C語言中最小的單位是char型別,char型別是1byte=8bit-8個地址,有點浪費地址了。最終平衡一下,一個記憶體單元是一個位元組的空間,然後進一步地分配地址的。
int main() { int a = 10;//a在記憶體中是要分配空間的,給a分配4個位元組,那麼給a分配的4個位元組是哪4個位元組呢? printf("% pn", &a);//%p專門用來列印地址的 int* pa = &a;//pa是用來存放地址的,在c語言中pa是叫指標變數(取a的地址,將a的地址放到pa裡面去) //*說明pa是指標變數,int說明pa執行的物件是int型別的 return 0; }
執行結果為:00000054E6EFFBE4,&a拿到的是四個位元組中的第一個位元組的地址。
再舉個例子:
int main() { char ch = 'w'; char * pc = &ch; printf("%pn",pc); return 0; }
執行結果為:
000000ACD04FF934
地址如何儲存?需要定義指標變數
int main() { int num = 10; int * p;//p為一個整型指標變數 p = # printf("%pn",p); return 0; }
00000030714FFB74
指標的使用範例:
#include <stdio.h> int main() { int a = 10; int* pa = &a; //*pa就是通過pa裡面的地址找到a,這裡的*叫解除參照操作符,是單目操作符 * pa = 20; printf("% dn" , a); return 0; } //修改a的值可以不直接改a,可以通過地址來間接地改a。
執行結果為20.修改a的值可以不直接改a,可以通過地址來間接改a。
int main() { printf("%dn",sizeof(char *)); printf("%dn", sizeof(short *)); printf("%dn", sizeof(int *)); printf("%dn", sizeof(double *)); return 0; }
執行結果均為8(其它幾種型別的指標大小也是8):
8
8
8
8
結論:指標的大小是相同的,指標是用來存放地址的,指標需要多大空間,取決於地址的儲存需要多大空間。指標在32位元平臺是4個位元組,在64位元平臺是8個位元組。
32位元機器上其實是32個位元位組成的二進位制序列,32bit=4byte
64位元機器上其實是64個位元位組成的二進位制序列,64bit=8byte
到此這篇關於C語言超詳細講解宏與指標的使用的文章就介紹到這了,更多相關C語言宏與指標內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45