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函数里,numvalue的副本,函数内对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函数中,numvalue的引用,对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语言、C++,操作系统,ARM架构、RTOS、Linux基础、Linux驱动、Linux系统移植、计算机网络、数据结构与算法、数电基础、模电基础、5篇面试题目、HR面试常见问题汇总和嵌入式面试简历模板等文章。超全的嵌入式软件工程师面试题目和高频知识点总结! 另外,专栏分为两个部分,大家可以各取所好,为了有更好的阅读体验,后面会持续更新!!!

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务