当前位置:网站首页>c语言---9 初识宏、指针
c语言---9 初识宏、指针
2022-06-10 17:31:00 【要努力丫!】
1、关于define
define是一个预处理指令,有两种用法,一种是用define定义常量;另外一种是define定义宏。
下面的例子为利用define定义常量
#define _CRT_SECURE_NO_WARNINGS
#define MAX 1000
#include <stdio.h>
int main()
{
printf("%d\n",MAX);
return 0;
}
运行结果为1000.
下面的例子是define定义宏
#define ADD(X,Y) X+Y
int main()
{
printf("%d\n",ADD(2,3));
return 0;
}
运行结果为5.
将printf("%d\n",ADD(2,3));改为printf("%d\n",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),这样一来运行结果就是我们所预期的结果了。
2、初识指针
(1)内存
我们买回来的电脑内存可能是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个地址,有点浪费地址了。最终平衡一下,一个内存单元是一个字节的空间,然后进一步地分配地址的。
(2)示例
int main()
{
int a = 10;//a在内存中是要分配空间的,给a分配4个字节,那么给a分配的4个字节是哪4个字节呢?
printf("% p\n", &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("%p\n",pc);
return 0;
}
运行结果为:
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。
运行结果为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;
}
运行结果均为8(其它几种类型的指针大小也是8):
8
8
8
8
结论:指针的大小是相同的,指针是用来存放地址的,指针需要多大空间,取决于地址的存储需要多大空间。指针在32位平台是4个字节,在64位平台是8个字节。
32位机器上其实是32个比特位组成的二进制序列,32bit=4byte
64位机器上其实是64个比特位组成的二进制序列,64bit=8byte
边栏推荐
- 美学心得(第二百三十七集) 罗国正
- AOV网拓扑排序
- Noise line h5js effect realized by canvas
- 图像搜索是什么
- CUDA realizes efficient search - failed audit?
- Abbexa 细菌基因组 DNA 试剂盒介绍
- 苹果放大招!这件事干的太漂亮了……
- PCA principal component analysis tutorial (origin analysis & drawing, without R language)
- JS special effect of canvas divergent particle H5 animation
- Set up an online help center to easily help customers solve problems
猜你喜欢
![[technical analysis] discuss the production process and technology of big world games - preliminary process](/img/44/5404f0da2e17099e89a92e37b2a0cb.png)
[technical analysis] discuss the production process and technology of big world games - preliminary process

国货彩妆,败走618

THE LOTTERY TICKET HYPOTHESIS: FINDING SPARSE, TRAINABLE NEURAL NETWORKS论文笔记

2022 version of idea graphical interface GUI garbled code solution super detailed simple version

Abbexa低样本量鸡溶菌酶 C (LYZ) ELISA 试剂盒

Abbexa 无细胞 DNA 试剂盒说明书

LeetCode树经典题目(一)

最新好文 | 基于因果推断的可解释对抗防御

High number_ Chapter 6 infinite series__ Absolute convergence_ Conditional convergence

Postman-接口测试工具
随机推荐
【技术分析】探讨大世界游戏的制作流程及技术——前期流程篇
numpy——记录
Analysis of transfer Refund Scheme in e-commerce industry
苹果期待的「无密码时代」,真能实现吗?
CUDA实现高效查找--审核未通过?
Abbkine柱式法ExKine Pro动物细胞/组织总蛋白提取试剂盒
LoRa模块无线收发通信技术详解
LeetCode 321. 拼接最大数***
The short ticket hypothesis: finding sparse, trainable neural networks
领导提拔你的原因,只有这点最真实,其他都是瞎扯!
线性移动棋
PCA主成分分析教程(origin分析&绘制,无须R语言)
mmdetection之model构建
系统需要把所有文件扫描一遍,并尝试识别视频的封面
Postman interface test tool
Numpy np set_ Usage of printoptions () -- control output mode
Cdga| six key points of data governance for industrial enterprises
高数_第6章无穷级数__绝对收敛_条件收敛
凹印套印原理及影响套印的因素
Abbexa丙烯酰胺-PEG-NHS说明书