C语言面试高频(C语言基础)
C语言基础
1 int main(int argc, char * argv[ ])函数中,参数argc和argv分别代表什么意思?⭐⭐⭐⭐
argc和argv参数在用命令行编译程序时有用。main( int argc, char* argv[] ) 中
第一个参数,int型的argc,为整型,用来统计程序运行时发送给main函数的命令行参数的个数,在VS中默认值为1。
第二个参数,**char*型的argv[],**为字符串数组,用来存放指向的字符串参数的指针数组,每一个元素指向一个参数。各成员含义如下:
argv[0]指向程序运行的全路径名
argv[1]指向在DOS命令行中执行程序名后的第一个字符串
argv[2]指向执行程序名后的第二个字符串
argv[3]指向执行程序名后的第三个字符串
2 结构体和共用体的区别⭐⭐⭐⭐
结构体和共用体的介绍
结构体(Struct)
结构体是一种用户自定义的数据类型,它允许你将不同类型的数据项组合在一起,形成一个逻辑上的整体。结构体中的每个数据项被称为成员(member),每个成员都有自己独立的内存空间。结构体就像是一个容器,可以把各种相关的数据组织起来,方便对这些数据进行统一管理和操作。
在许多编程语言中,如 C、C++、Python(通过类模拟)等都支持结构体的概念。以 C 语言为例,下面是一个简单的结构体定义,用于表示一个学生的信息:
// 定义一个结构体,用于表示学生信息 struct Student { char name[50]; int age; float score; };
在这个例子中,Student
结构体包含了三个成员:name
(字符数组,用于存储学生姓名)、age
(整数,用于存储学生年龄)和score
(浮点数,用于存储学生成绩)。
共用体(Union)
共用体也是一种用户自定义的数据类型,它同样可以包含多个不同类型的成员。但与结构体不同的是,共用体的所有成员共享同一块内存空间。这意味着在同一时间,共用体只能存储一个成员的值。当给共用体的一个成员赋值时,会覆盖掉之前存储在该内存空间中的其他成员的值。
以下是一个 C 语言中共用体的简单示例:
// 定义一个共用体,用于存储不同类型的数据 union Data { int i; float f; char str[20]; };
在这个例子中,Data
共用体包含了三个成员:i
(整数类型)、f
(浮点数类型)和str
(字符数组类型)。这三个成员共享同一块大小为 20 字节(str
数组大小)的内存空间。
结构体struct和共用体union的区别
比较项 |
结构体(struct) |
共用体(union) |
内存分配 |
每个成员都有独立的内存空间,结构体总大小是各成员大小之和,可能因内存对齐而变大 |
所有成员共享同一块内存空间,大小由最大的成员决定 |
数据存储 |
可同时存储多个成员的值,每个成员有自己的存储位置 |
同一时间只能存储一个成员的值,给一个成员赋值会覆盖其他成员的值 |
访问方式 |
可同时访问多个成员,通过成员名访问不同成员的值 |
同一时间只能访问一个成员,因为成员共享内存 |
应用场景 |
适用于需要同时存储多个相关数据的场景,如表示一个人的信息(姓名、年龄、性别等) |
适用于不同类型的数据不会同时使用的场景,如某个变量可能表示整数或浮点数,但不同时表示两者 |
3 简述C++有几种传值方式,之间的区别是什么?⭐⭐⭐⭐
在 C++ 里,传值方式主要有三种,分别是值传递、引用传递和指针传递,下面为你简述它们的特点及区别。
值传递
- 原理:在函数调用时,会把实参的值复制一份给形参。函数内部对形参的操作,不会影响到实参。
- 示例代码:
#include <iostream> void changeValue(int num) { num = 10; } int main() { int value = 5; changeValue(value); std::cout << "值传递后,实参的值为: " << value << std::endl; return 0; }
- 代码解释:在
changeValue
函数里,num
是value
的副本,函数内对num
的修改不会影响到main
函数中的value
。
引用传递
- 原理:函数的形参是实参的引用,也就是实参的别名。函数内部对形参的操作,实际上就是对实参的操作。
- 示例代码:
#include <iostream> void changeValue(int& num) { num = 10; } int main() { int value = 5; changeValue(value); std::cout << "引用传递后,实参的值为: " << value << std::endl; return 0; }
- 代码解释:在
changeValue
函数中,num
是value
的引用,对num
的修改就是对value
的修改。
指针传递
- 原理:函数的形参是指针类型,传递的是实参的地址。通过指针,函数内部可以访问和修改实参的值。
- 示例代码:
#include <iostream> void changeValue(int* num) { *num = 10; } int main() { int value = 5; changeValue(&value); std::cout << "指针传递后,实参的值为: " << value << std::endl; return 0; }
- 代码解释:在
changeValue
函数中,num
是指向value
的指针,通过*num
可以修改value
的值。
三种传值方式的区别
比较项 |
值传递 |
引用传递 |
指针传递 |
内存开销 |
会复制实参的值,存在额外的内 |
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
该专栏面向嵌入式开发工程师、C++开发工程师,包括C语言、C++,操作系统,ARM架构、RTOS、Linux基础、Linux驱动、Linux系统移植、计算机网络、数据结构与算法、数电基础、模电基础、5篇面试题目、HR面试常见问题汇总和嵌入式面试简历模板等文章。超全的嵌入式软件工程师面试题目和高频知识点总结! 另外,专栏分为两个部分,大家可以各取所好,为了有更好的阅读体验,后面会持续更新!!!