網(wǎng)站首頁 編程語言 正文
1、關(guān)于define
define是一個預處理指令,有兩種用法,一種是用define定義常量;另外一種是define定義宏。
下面的例子為利用define定義常量
#define _CRT_SECURE_NO_WARNINGS #define MAX 1000 #include <stdio.h> int main() { printf("%d\n",MAX); return 0; }
運行結(jié)果為1000.
下面的例子是define定義宏
#define ADD(X,Y) X+Y int main() { printf("%d\n",ADD(2,3)); return 0; }
運行結(jié)果為5.
將printf("%d\n",ADD(2,3));
改為printf("%d\n",4*ADD(2,3));
,則運行結(jié)果為11.預期的運行結(jié)果為4x5=20,為什么會出現(xiàn)這樣的結(jié)果呢?因為define定義宏是替換,就變成了4x2+3=11了,4x2為X,Y仍然是3。如何讓其得到正確的結(jié)果20呢?在寫宏的時候,將X與Y括起來,因為X與Y可能不是簡單的數(shù)字,它可能是表達式,所以定義宏的時候應該是這樣的定義方法:#define ADD(X,Y) (X+Y)
,這樣一來運行結(jié)果就是我們所預期的結(jié)果了。
2、初識指針
(1)內(nèi)存
我們買回來的電腦內(nèi)存可能是4g、8g、16g,這么大的內(nèi)存空間我們該如何去使用它呢?內(nèi)存屬于空間,內(nèi)存的使用相當于空間的使用,與現(xiàn)實生活中空間的使用很相似。現(xiàn)實生活中是怎么找到空間的呢?是通過地址,而地址又跟房間所關(guān)聯(lián)。比如:北京市海淀區(qū)某街道100號。
內(nèi)存是電腦上特別重要的存儲器,計算機中所有的程序的運行都是在內(nèi)存中進行的,所以為了有效地使用內(nèi)存,就把內(nèi)存劃分成一個一個小的內(nèi)存單元,每個內(nèi)存單元的大小是1個字節(jié),為了能夠有效地訪問到內(nèi)存的每個單元,就給內(nèi)存單元進行了編號,這些編號被稱為內(nèi)存單元的地址。
如下圖所示:
問題來了,內(nèi)存是怎么編號的呢?一個這樣的內(nèi)存單元是多大空間?
對于機器來說,有32位機器,也有64位機器;32位機器指的是有32根地址線,地址線就是物理線,物理線是可以通電的,通電的時候電信號轉(zhuǎn)換成數(shù)字信息:正電是1,負電是0,就變成1和0組成的二進制序列。
對于32位機器有32位地址線,那么32位地址線組成的信號排列有很多很多種,多達2的32次方個,這些序列都可以作為內(nèi)存的編號(從0開始到2^32-1),我們把這些編號稱為內(nèi)存單元的地址
00000000 00000000 00000000 00000000
…
01111111 11111111 11111111 11111111
10000000 00000000 00000000 00000000
…
11111111 1111111 111111111 111111111
一個這樣的內(nèi)存單元是多大的空間呢?
假設一個內(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
實際上在32位機器的時候,2GB的內(nèi)存已經(jīng)很常見了。C語言中最小的單位是char類型,char類型是1byte=8bit-8個地址,有點浪費地址了。最終平衡一下,一個內(nèi)存單元是一個字節(jié)的空間,然后進一步地分配地址的。
(2)示例
int main() { int a = 10;//a在內(nèi)存中是要分配空間的,給a分配4個字節(jié),那么給a分配的4個字節(jié)是哪4個字節(jié)呢? printf("% p\n", &a);//%p專門用來打印地址的 int* pa = &a;//pa是用來存放地址的,在c語言中pa是叫指針變量(取a的地址,將a的地址放到pa里面去) //*說明pa是指針變量,int說明pa執(zhí)行的對象是int類型的 return 0; }
運行結(jié)果為:00000054E6EFFBE4,&a拿到的是四個字節(jié)中的第一個字節(jié)的地址。
再舉個例子:
int main() { char ch = 'w'; char * pc = &ch; printf("%p\n",pc); return 0; }
運行結(jié)果為:
000000ACD04FF934
(3)指針的使用示例
地址如何存儲?需要定義指針變量
int main() { int num = 10; int * p;//p為一個整型指針變量 p = # printf("%p\n",p); return 0; }
00000030714FFB74
指針的使用示例:
#include <stdio.h> int main() { int a = 10; int* pa = &a; //*pa就是通過pa里面的地址找到a,這里的*叫解引用操作符,是單目操作符 * pa = 20; printf("% d\n" , a); return 0; } //修改a的值可以不直接改a,可以通過地址來間接地改a。
運行結(jié)果為20.修改a的值可以不直接改a,可以通過地址來間接改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; }
運行結(jié)果均為8(其它幾種類型的指針大小也是8):
8
8
8
8
結(jié)論:指針的大小是相同的,指針是用來存放地址的,指針需要多大空間,取決于地址的存儲需要多大空間。指針在32位平臺是4個字節(jié),在64位平臺是8個字節(jié)。
32位機器上其實是32個比特位組成的二進制序列,32bit=4byte
64位機器上其實是64個比特位組成的二進制序列,64bit=8byte
原文鏈接:https://blog.csdn.net/qq_42822743/article/details/125089757
相關(guān)推薦
- 2022-07-10 a元素的幾種偽類選擇器
- 2022-11-29 Mybatis傳入?yún)?shù)類型不匹配導致的報錯:
- 2023-06-04 Pandas中MultiIndex選擇并提取任何行和列_python
- 2022-11-01 C語言strlen,strcpy,strcmp,strcat,strstr字符串操作函數(shù)實現(xiàn)_C 語
- 2022-04-15 python實現(xiàn)AES算法及AES-CFB8加解密源碼_python
- 2022-05-25 C#多線程實現(xiàn)異步接口_C#教程
- 2022-04-18 python全面解析接口返回數(shù)據(jù)_python
- 2022-08-02 flask后端request獲取參數(shù)的幾種方式整理_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支