C语言 17个问题及回答

1.说一下 static  关键字的作用

Static的中文意思是静态的,用于引入静态变量,静态变量有静态局部变量和静态全局变量

1.静态局部变,在函数中使用static引入并初始化一个变量,重复调用函数,变量的值不会初始化而是会累积。

2.静态全局变量,在文件头部引入一个静态变量,这个变量不允许被其他文件调用,只允许在该文件内使用。

原理:

静态变量存储在静态存储区而不是栈上。这个存储区在程序开始时被分配,并在程序运行期间一直存在。

(也称为数据段或BSS段。静态存储区通常包含以下几部分:.data 段:存放已初始化的全局和静态变量。.bss 段:存放未初始化的全局和静态变量。)

2.什么是静态存储区?

首先C语言的储存区有四个,分别是静态存储区,栈区,堆区,代码区。

静态存储区储存的是静态变量,全局变量,常量,这三个。而常见的变量储存在栈区

原理部分:

静态存储区(Static Storage Area)储存静态变量,全局变量和常量

栈区(Stack Area)栈区用于存储局部变量和函数调用时的上下文信息(如函数参数、返回地址和局部变量)。栈区的特点是后进先出(LIFO),每次函数调用时,会在栈顶分配内存,函数返回时释放这些内存。栈的内存管理由编译器自动完成。

堆区(Heap Area)堆区用于动态分配内存,即在程序运行时使用函数(如 malloc、calloc、realloc)来分配内存,并使用 free 函数来释放内存。堆区的管理由程序员负责,内存的分配和释放顺序是任意的。

代码区(Code Area)代码区存储程序的机器码,即可执行代码。代码区通常是只读的,以防止程序意外修改指令。

3.说一下const作用

Const是constant的缩写,中文意思是恒定的,被const定义的变量不可变,叫常量。

此外const可以用于修饰指针,有两种情况

第一种指向的内容不可修改,指针指向的地址可以修改。比如const int*p

第二种指针指向的地址不可修改,但是指针指向的内容的值可以修改。比如int*const p

4.在 C 语言中,#define、static 和 const 都可以用来定义常量,区别是什么

Define是预处理器指令,在文件的最开始使用,作用范围直到文件结束。没有类型信息。不分配内存,因为它是一种文本替换。

Const有类型信息,可以是全局作用域,也可以仅在函数内使用,取决于使用方法。分配内存

Static有类型信息,作用范围是函数内,或文件内,分配内存

5.说一下对象与属性的概念

在 C 语言中,并没有严格意义上的“对象”和“属性”的概念,因为这些术语通常与面向对象编程(OOP)相关,C 语言是一种面向过程的编程语言。但是我可以回答这个问题。属性是对象的“状态”或“特征”,即对象包含的数据。它们通常被称为“字段”或“成员变量”。同时属性存储有关对象的信息。例如,一个“汽车”对象可能有“颜色”、“速度”等属性,表示该汽车的状态。

6.什么是面向过程

面向过程编程关注于函数的调用和数据的处理。它将程序视为一系列按顺序执行的过程(函数)和操作。比较简单易于理解

7.什么是面向对象

面向对象编程通过“对象”来组织程序。对象是类的实例,类定义了对象的属性和方法。OOP强调通过封装、继承和多态等机制来组织代码。

原理部分:

封装:将数据和操作数据的函数捆绑在一起,形成对象。外部不直接操作数据,而是通过方法进行。

继承:允许一个类继承另一个类的属性和方法,实现代码复用。

多态:允许不同的对象通过相同的接口调用不同的实现。

方法是对象的“行为”或“功能”,即操作对象的代码。它们通常是类中的函数,用来定义如何与对象进行交互。方法允许对象执行某些操作,修改属性值,或与其他对象进行交互。

8.C语言中指针和引用的区别

指针是存储变量地址的变量,可以进行算术运算;引用是变量的别名,初始化后不可更改。指针需解引用访问值,引用直接访问。

9.请回答一下数组和指针的区别

数组是固定大小的内存块,存储相同类型元素;指针是存储变量地址的变量,可以动态指向不同地址。数组名时指针常量

10.请回答下指针数组和数组指针的区别

指针数组是一个数组,元素是指针,如 int *arr[5],存储五个指向 int 的指针。数组指针是指向数组的指针,如 int (*ptr)[5],指向包含五个 int 元素的数组。

11.请回答下指针函数和函数指针的区别

指针函数是返回指针的函数,如 int* func() 返回 int 类型指针。函数指针是指向函数的指针,如 int (*fptr)(int, int) 指向接受两个 int 参数并返回 int 的函数。

原理:

#include <iostream>

int* func() {

    static int value = 42; // 使用 static 以确保返回的指针指向有效内存

    return &value;

}

int main() {

    int* ptr = func();

    std::cout << "Value: " << *ptr << std::endl; // 输出 42

    return 0;

}

这个函数返回的一个指针

在主函数调用函数时,可以为指针赋值

12.请你回答一下野指针是什么?

野指针是指向无效内存地址的指针。它可能指向已释放的内存或未初始化的地址,导致不可预测的行为或程序崩溃。避免野指针的方法包括初始化指针和在释放内存后将指针设为 NULL。

13.说一下 C++和 C 的区别

结论:C++ 是 C 的增强版,支持面向对象编程。

类与对象:C++ 引入了类和对象,支持封装、继承和多态。

14.说一下#include"stdio.h"和#include<stdio.h>区别

#include "stdio.h" 和 #include <stdio.h> 的主要区别在于头文件的搜索路径:

#include <stdio.h>:编译器会在标准库路径中搜索 stdio.h 文件,通常用于包含标准库头文件。

#include "stdio.h":编译器会先在当前目录搜索 stdio.h 文件,如果找不到,再在标准库路径中搜索。通常用于包含自定义头文件。

15.请你说一说 strcpy 和 strlen

结论:strcpy 用于字符串复制,strlen 用于获取字符串长度。

16. 栈和堆的区别.

栈用于存储局部变量和函数调用,内存由系统自动分配和释放,速度快,遵循后进先出原则。堆用于动态分配内存,适合存储生命周期较长或大小不确定的数据,内存由程序员手动管理,分配和释放较慢,且容易导致内存泄漏。

17.结构体和联合体的区别是什么?

结构体中每个成员都有独立的内存空间,成员可以同时存储不同的值;而联合体的所有成员共享同一块内存,只有一个成员可以在任意时刻存储值,大小取决于最大成员。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值