高级C语言-离散的小问题

本文介绍了C语言中main函数的argc和argv参数传递方式,void类型的本质及其在内存分配中的作用,以及运算过程中的临时匿名变量。同时,探讨了程序调试中的多种方法,如单步调试、硬件调试、printf和日志文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

argc,argv与main函数的传参

给mian传参是怎样实现的?
(1)给main传参通过argc和argv这两个C语言预定的参数来实现
(2)argc是int类型,表示运行程序的时候给main函数传递了几个参数:argv是一个字符串数组,这个数组用来存储多个字符串,每个字符串就是我们给main函数传的一个参数。argv[0]就是我们给main函数的第一个传参,argv[1]就是传给main的第二个参数…
本质上:给main传参是怎样实现的?
(1)程序调用有各种各样的方法,但是本质上都是父进程fork一个子进程,然后字进程和一个程序绑定起来执行(exec函数),我们在exec的时候可以给他同时传参
(2)程序调用时可以被传参(也就是main的传参)是操作系统层面的支持完成的
给main传参要注意什么?
(1)main函数传参都是通过字符串传进去的
(2)程序被调用时传参,各个参数之间是通过空格来间隔的
(3)在程序内部如果要使用argv,那么一定要先检验argc

void类型的本质

数据类型的本质含义
(1)数据类型的本质就是决定内存的占用数,和内存的解析方法
(2)C语言中变量必须确定的数据类型,如果一个变量没有确定的类型(就是所有的类型。实际上纯粹的内存是没有类型的,内存只是因为和具体的变量相关联后才有确定的类型(其实内存本省都不知道的,而编译器知道,我们程序在使用这个内存时知道类型所以会按照类型的含义去进行内存的读写))
void类型的本质
(1)void类型的正确的含义是:不知道类型,不确定类型,还没确定类型
(2)void a;定义了一个void类型的变量,含义就是说a是一个变量,而且a肯定有确定的类型,只是目前我们还不知道a的类型,还不确定,所以标记为void
为什么需要void类型
(1)在描述一段还没有具体使用的内存需要使用void类型
(2)void的一个典型案例就是malloc的返回值。我们知道malloc函数向系统堆管理器申请一段内存给当前程序使用,malloc返回的是一个指针,这个指针指向申请的那段内存,malloc刚申请的那段内存尚未用来存储数据,malloc函数也无法预知这段内存将来被存放什么类型的数据,所以malloc无法返回具体类型的指针,解决方法就是返回一个void * 类型,高数外部我们返回的是一段干净的内存空间,尚未被确定类型
(3)void * 类型的指针指向的内存是尚未确定类型的,因此我们后续可以使用强制类型转化强制将其转为各种类型,也就是void类型的归宿,然后强制类型转换为具体的类型。
(4)void类型使用时一般都是用void *,而不是仅仅使用void

运算中的临时匿名变量

临时变量来理解强制类型转换
(int )a强制类型转换并赋值在底层实际上分了4个步骤:第一步先在另外的地方找一个内存结构建一个临时变量x(x的类型是int,x的值等于a的整数部分),第二步将float a的值得整数部分赋值给x,第三步将x赋值给b,第四步销毁x
最后的结果:a还是float而且值保持不变,b是a的整数部分

float a = 12.56;
int b = (int)a;
printf("a = %f,b = %d",a,b);

使用临时变量来理解不同数据类型之间的运算

int b;
float a;
b = 10;
a = b / 3;//第一步先算b / 3;第二步将第一步的结果强制类型转换为float生成一个临时变量,第三步将第二步生成的临时变量赋值给a,第四步销毁临时变量。
printf("a = %f.\n",a);

程序调试的debug宏

程序调试的常见方案:单步调试,逻辑LED调试,打印信息,log文件
(1)利用调试器进行单步调试(IDE中,Jlink)适合新手,最大的好处就是直观,能够帮助找到问题,缺点是限制性大,速度慢
(2)裸机使用LED,蜂鸣器等硬件调试,适合单片机裸机程序
(3)printf函数打印调试,作为程序员需要会使用打印信息调试。好处是具有普遍性,几乎在所有的情况下都能用
(4)log文件(日志文件)是系统运行过程中在特定时候会打印一些调试信息,日志文件记录下这些调试信息以供后续查找追查问题,使用于系统级或者大型程序的调试
分析几个DEBUG方法

#ifdef DEBUG
#define DBG(...) fprintf(stderr,"DBG(%s,%s(),%d):",__FILE__,__FUNCTION__,__LINE__);fprintf(stderr,__VA_ARGS)
#else
#define DBG(...)
#endif

注:__FILE__等是C语言中的预定义宏,就是说这个东西是个宏定义,但是C语言自己定义的。这个宏具体特殊的含义,譬如__FILE__表示当前正在编译的C文件得到文件名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值