C/C++面试八股题(七)
更多专栏:
超详细的嵌入式面经专栏(适用于小白学习和大佬复习):https://www.nowcoder.com/creation/manager/columnDetail/mGYoDz
校招公司汇总专栏:https://www.nowcoder.com/creation/manager/columnDetail/0ybKdp
目录:
1.C 和 C++ 中常见的变量定义方式有哪些?
2.简单说明一下extern关键字,以及extern”C” 有什么作用?
3.请说明一下static关键字?
4.简单说说#include<> 和 #include""的区别是什么?
5.简单说说什么是原码、什么是反码、什么是补码?
6.请说说const关键字的用法?
内容:
1.C 和 C++ 中常见的变量定义方式有哪些?
基本类型
例子:
int x = 10; // 定义一个整数变量 x,初始化为 10 float y = 3.14f; // 定义一个浮点数变量 y,初始化为 3.14 double z = 3.14159; // 定义一个双精度浮点数变量 z,初始化为 3.14159 char c = 'A'; // 定义一个字符变量 c,初始化为字符 'A'
const
常量变量
const
定义常量,使得该变量值不可修改。例子:
const int MAX = 100; // 定义常量 MAX,值为 100,不可修改 const float PI = 3.14f; // 定义常量 PI,值为 3.14
volatile
变量
volatile
用来修饰变量,告诉编译器该变量的值可能随时变化(例如在中断或硬件寄存器中),因此每次访问时都必须从内存中读取,而不是从寄存器中缓存。指针变量
例子:
int a = 10; int *p = &a; // 定义一个指针 p,指向变量 a 的地址
常量指针与指针常量与常量指针常量(在专栏四也有讲过)
常量指针
- 常量指针概念:常量指针是一个指针,它指向的内容是常量。也就是说,通过这个指针不能修改它所指向的数据,但指针本身的值(即它指向的地址)可以改变。
- 语法形式:const 数据类型* 指针变量名;
int a = 10; int b = 20; const int* p = &a; // *p = 30; // 这是错误的,不能通过p修改它指向的值 p = &b; // 这是正确的,p可以指向另一个变量
- 解释:在这个例子中,
p
被定义为一个常量指针,指向a
。我们不能通过p
来修改a
的值,因为p
所指向的内容被视为常量。但是,p
本身可以重新指向其他变量,比如让它指向b
。
指针常量
- 指针常量概念:指针常量是一个常量,它一旦被初始化指向一个地址后,就不能再指向其他地址,但可以通过这个指针修改它所指向的数据。
- 语法形式:数据类型* const 指针变量名;
int a = 10; int* const p = &a; *p = 20; // 这是正确的,可以通过p修改它指向的值 // p = &b; // 这是错误的,p不能再指向其他地址
- 解释:这里
p
是一个指针常量,它被初始化为指向a
。之后就不能再让p
指向其他变量了,但是可以通过p
来修改a
的值,如将a
的值修改为20
。
常量指针常量
const int * const p = &a; // 定义一个常量指针常量 p,指向常量 a p = &b; // 错误:p 是常量指针,不能修改指向的地址 *p = 20; // 错误:不能修改 *p 指向的内容
6. 数组变量
例子:
int arr[5] = {1, 2, 3, 4, 5}; // 定义一个包含 5 个整数的数组 arr char str[] = "Hello"; // 定义一个字符串数组,大小由初始化推导
结构体变量
例子:
struct Point { int x; int y; }; struct Point p1 = {10, 20}; // 定义一个结构体变量 p1,初始化为 (10, 20)
枚举变量
例子:
enum Color { RED = 1, GREEN, BLUE }; // 定义一个枚举类型 Color,包含 RED、GREEN、BLUE enum Color color = RED; // 定义一个枚举变量 color,值为 RED
类型定义 (typedef
)
typedef
用于为已有的数据类型定义新的别名,简化复杂类型的定义。例子:
typedef unsigned int uint; // 为 unsigned int 类型定义别名 uint uint a = 5; // 使用别名 uint 定义变量 a
auto
关键字(C++11)(了解即可)
auto
关键字会根据初始化表达式推导出变量的类型,减少冗长的类型声明。例子:
auto x = 5; // auto 推导出 x 是 int 类型 auto y = 3.14; // auto 推导出 y 是 double 类型
register
关键字 (了解即可)
register
用于建议编译器将变量存储在寄存器中,以便更快的访问。现代编译器通常会忽略此修饰符,自动优化。 extern
关键字
extern
用于声明一个变量在其他文件中定义,使其可以在当前文件中访问。 inline
关键字(C++)(了解即可)
inline
关键字用于声明内联函数,它建议编译器将函数体直接插入调用点,减少函数调用的开销。例子:
inline int add(int a, int b) { return a + b; }
static
关键字
static
修饰变量时,表示该变量的生命周期延续至程序结束,并且仅在定义它的函数或文件内可见(局部静态变量或文件静态变量)。例子:
- 局部静态变量:
void func() { static int count = 0; // 局部静态变量,保留函数调用间的值 count++; printf("%d\n", count); }
thread_local
关键字(C++11)(了解即可)
thread_local
关键字用于定义线程局部变量,每个线程都有一个独立的副本。mutable
关键字(C++)(了解即可)
mutable
允许修改 const
成员变量的值,通常用于类中标记那些即使在常量对象中也可以修改的成员变量。例子:
class MyClass { mutable int count; public: MyClass() : count(0) {} void increment() const { count++; // 即使在 const 成员函数中,也可以修改 count } };
2.简单说明一下extern关键字,以及extern”C” 有什么作用?
extern
用于变量声明
extern
关键字常用于声明在其他文件中定义的全局变量。通过 extern
,extern 可以声明一个变量,使得该变量是来自其他文件的变量在本文件可以被访问。
例子:
file1.c:
#include <stdio.h> int globalVar = 100; // 在 file1.c 中定义一个全局变量
file2.c:
#include <stdio.h> extern int globalVar; // 声明在其他地方定义的全局变量 void printGlobalVar() { printf("globalVar = %d\n", globalVar); // 访问 file1.c 中的 globalVar }
main.c:
#include <stdio.h> extern vo
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
嵌入式/C++八股 文章被收录于专栏
本人双飞本,校招上岸广和通。此专栏覆盖嵌入式常见面试题,有C/C++相关的知识,数据结构和算法也有嵌入式相关的知识,如操作系统、网络协议、硬件知识。本人也是校招过来的,大家底子甚至项目,可能都不错,但是在面试准备中常见八股可能准备不全。此专栏很适合新手学习基础也适合大佬备战复习,比较全面。最终希望各位友友们早日拿到心仪offer。也希望大家点点赞,收藏,送送小花。这是对我的肯定和鼓励。 持续更新