文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C语言宏与指针如何使用

2023-07-02 09:12

关注

这篇文章主要讲解了“C语言宏与指针如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言宏与指针如何使用”吧!

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+Yint 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个字节,为了能够有效地访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为内存单元的地址。

如下图所示:

C语言宏与指针如何使用

问题来了,内存是怎么编号的呢?一个这样的内存单元是多大空间?

对于机器来说,有32位机器,也有64位机器;32位机器指的是有32根地址线,地址线就是物理线,物理线是可以通电的,通电的时候电信号转换成数字信息:正电是1,负电是0,就变成1和0组成的二进制序列。

对于32位机器有32位地址线,那么32位地址线组成的信号排列有很多很多种,多达2的32次方个,这些序列都可以作为内存的编号(从0开始到2^32-1),我们把这些编号称为内存单元的地址

00000000 00000000 00000000 00000000

&hellip;

01111111 11111111 11111111 11111111

10000000 00000000 00000000 00000000

&hellip;

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 = &num;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

感谢各位的阅读,以上就是“C语言宏与指针如何使用”的内容了,经过本文的学习后,相信大家对C语言宏与指针如何使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯