突破编程_C++_面试(基础知识(4))

面试题6:delete 与 delete[] 的区别

delete 和 delete[] 都用于释放动态分配的内存的操作符。它们之间的主要区别在于它们所处理的对象类型不同。
delete 用于释放单一对象的内存。对于简单类型,计算好大小后创建内存,对于复杂结构,先调用计算并分配内存,然后在分配的内存上调用构造函数。如下为样例代码:

int* val = new int; // 使用 new 分配一个整型内存   
delete val; 		// 使用 delete 释放内存

delete[] 用于释放对象数组的内存,如下为样例代码:

int* vals = new int[10]; // 使用 new 分配一个长度为 10 的整型数组内存  
delete[] vals; 			// 使用 delete[] 释放内存

delete[] 的原理:在使用 new[] 操作符来动态分配数组时,内存管理器会为数组分配一块连续的内存空间,这个内存空间大小并不等于对象大小*数组长度,而是多了 8 个字节( x64 编译),这 8 个字节就是数组长度。在使用 delete[] 操作符来释放这块内存时,便能够从该内存中读取数组长度,从而完整的释放整个数组占用的内存空间,并将该内存空间标记为可用。
值得注意的是多维数组的内存释放(需要使用循环):

int** vals = new int*[2];
for (size_t i = 0; i < 2; i++)
{
	vals[i] = new int[3]();
}

for (size_t i = 0; i < 2; i++)
{
	delete[] vals[i];		//注意 delete 一定要加上中括号 []
}

面试题7:数组有哪些遍历方式

(1)一维数组的遍历
方式一:for 循环遍历

int vals[6]{};
for (size_t i = 0; i < sizeof(vals) / sizeof(int); i++)
{
	printf("%d ", vals[i]);
}

注意计算一维数组长度的方法:sizeof(vals) / sizeof(int),也可以使用 sizeof(vals) / sizeof(vals[0])
方式二:基于范围的 for 循环遍历
基于范围的 for 循环是在 C++11 标准中推出的新的语法,相比于传统的 for 循环,该方法无需关注数组的起始与长度,更适用于开发。

int vals[6]{};
for (const auto& val : vals)
{
	printf("%d ", val);
}

(2)多维数组的遍历
方式1:for 循环遍历
使用数组各维度长度作为循环变量的范围(推荐)

int valLists[2][3] = { 1,2,3,4,5,6 };
for (size_t i = 0; i < 2; i++)
{
	for (size_t j = 0; j < 3; j++)
	{
		printf("%d ", valLists[i][j]);
	}
}

使用 sizeof 运算符计算,但是需要注意计算方法(不推荐,计算较为复杂)

int valLists[2][3] = { 1,2,3,4,5,6 };
for (size_t i = 0; i < sizeof(valLists)/ sizeof(valLists[0]); i++)
{
	for (size_t j = 0; j < sizeof(valLists[0]) / sizeof(int); j++)
	{
		printf("%d ", valLists[i][j]);
	}
}

方式2:基于范围的 for 循环遍历
基于范围的 for 循环是用于多维数组更为方便,不需要考虑每个维度的长度。

int valLists[2][3] = { 1,2,3,4,5,6 };
for (const auto& vals : valLists)
{
	for (const auto& val : vals)
	{
		printf("%d ", val);
	}
}

面试题8:什么是动态数组?如何在C++中实现动态数组

动态数组是指在运行时大小可以改变的数组。与静态数组不同,动态数组的大小是可以在程序运行时被修改,而不是在编译时确定的。可以使用 C++ 标准库中的 std::vector 来实现动态数组。
std::vector 提供了类似于数组的接口,但可以在运行时动态地调整大小。使用 std::vector 可以方便地添加、删除和访问元素,同时它还提供了许多有用的成员函数,如 push_back() 、 pop_back() 、 resize() 等。如下为样例代码:

#include 
#include 

using namespace std;

int main()
{
	// 创建包含 6 个元素的vector
	vector<int> vals = { 1, 2, 3, 4, 5, 6 };

	// 访问数组中的元素  
	vals[0] = 10;
	vals[1] = 15;

	// 向数组中添加元素  
	vals.push_back(20);
	vals.push_back(21);
	vals.push_back(22);

	// 遍历数组并输出每个元素  
	for (auto it = vals.begin(); it != vals.end(); it++)
	{
		printf("%d ", *it);
	}

	printf("\n");

	return 0;
}

上面代码输出:

10 15 3 4 5 6 20 21 22

你可能感兴趣的:(突破编程_C++_面试,c++,面试)