如何在C++类构造函数中用指针/引用初始化二维数组为空格
用指针/内存操作初始化TicTacToe的二维数组
嘿,其实二维数组在内存里是连续存储的,所以咱们完全不用写嵌套循环,靠指针相关的内存操作就能一键把所有元素初始化为空格,给你两种实用的实现方式:
方法1:用C++标准库的std::fill(指针迭代器方式)
C++的std::fill可以填充一段连续的迭代器范围,而二维数组M[3][3]可以隐式转换成指向第一个元素的指针。咱们可以把整个二维数组当成一段9个字符的连续内存块来处理:
#include <algorithm> // 必须包含这个头文件才能用std::fill class TicTacToe { char M[3][3]; int numRemainingChoices; char turn; public: TicTacToe() { // *M 等价于 &M[0][0],指向数组第一个元素的指针 // *M + 9 指向数组最后一个元素的下一个位置(左闭右开范围) std::fill(*M, *M + 9, ' '); numRemainingChoices = 9; turn = 'X'; // 这里默认先手是X,你可以根据需求调整 } // 其他成员函数... };
这里的核心是利用了数组名退化为指针的特性,*M就是指向数组首元素的指针,通过指定指针范围,std::fill会帮我们完成内存填充,不用手动写循环。
方法2:用C风格的memset(底层内存操作)
如果想更贴近底层指针操作,C语言的memset函数可以按字节填充内存。因为char是1字节类型,用这个函数完全安全:
#include <cstring> // 包含memset的头文件 class TicTacToe { char M[3][3]; int numRemainingChoices; char turn; public: TicTacToe() { // M是数组名,退化为指向数组起始位置的指针 // sizeof(M)会计算整个二维数组的总字节数(3*3*1=9) memset(M, ' ', sizeof(M)); numRemainingChoices = 9; turn = 'X'; } // 其他成员函数... };
memset直接接收内存起始地址和要填充的字节数,本质就是通过指针直接操作底层内存,内部的循环是函数实现的,咱们不用显式写出来。
注意事项
- 这两种方法都依赖于二维数组在内存中的连续性,C++标准保证了多维数组的元素是连续存储的,所以不用担心问题。
- 如果你的数组元素类型不是
char(比如int),memset就不能随便用了,因为它按字节填充,会把多字节元素的每个字节都设为同一个值,导致结果不符合预期,但char类型完全没问题。
内容的提问来源于stack exchange,提问作者Alex Names
相关产品推荐
相关产品推荐

