对于带指针和终止空值的循环

Web*_*btm -7 c++ null

char charArray[10];
char* pArray = charArray;
for(int i = 0; i < 10; i++)
{
*pArray = '\0';
pArray++;
}
Run Code Online (Sandbox Code Playgroud)

从这个片段开始,*pArray ='\ 0'是什么?意思?我不明白这.

Vla*_*cow 10

在循环指针由于其初始化而指向pArray数组的第一个字符之前charArray.

char* pArray = charArray;
Run Code Online (Sandbox Code Playgroud)

因此,在第一次迭代的循环内部*pArray产生对数组的第一个字符的引用.因此,引用的字符由字符文字'\ 0'指定.

*pArray = '\0';
Run Code Online (Sandbox Code Playgroud)

然后指针被指示

pArray++;
Run Code Online (Sandbox Code Playgroud)

并指向下一个字符.因此,在下一次迭代中,数组的第二个字符将设置为'\ 0'.由于循环有10次迭代,因此数组的所有10个字符将由'\ 0'初始化.

这可以在数组定义中更简单地完成

char charArray[10] = {};
Run Code Online (Sandbox Code Playgroud)

在这种情况下,数组的所有10个字符也将由'\ 0'初始化.

在C中,等效结构看起来像

char charArray[10] = { '\0' };
Run Code Online (Sandbox Code Playgroud)

考虑到如果仅在循环内部需要变量pArray来初始化数组的元素,那么最好以下面的方式编写循环(如果你想使用指针):

const size_t N = 10;
char charArray[N];

for ( char *pArray = charArray; pArray != charArray + N; ++pArray )
{
  *pArray = '\0';
}
Run Code Online (Sandbox Code Playgroud)

实际上,这个循环相当于std::fill你可以使用的标准算法的内部实现.

例如

const size_t N = 10;
char charArray[N];

std::fill( charArray, charArray + N, '\0' );
Run Code Online (Sandbox Code Playgroud)

或者您可以使用标准函数std::begin并std::end指定数组的第一个和最后一个迭代器.

  • @Griwes看来我对这个问题的回答对你来说也很有用.现在您将知道上面提到的构造不是有效的C构造C不允许空的初始化列表.:) (10认同)
  • @Griwes这不是一个可怕的问题.答案很有意义,因为它解答了问题并理解了C++的结构和定义.我认为问题不在于问题,而在于你. (4认同)
  • @Griwes问题中没有足够的信息来确定使用`std :: string`是否是个好主意.并且只是建议不解释其含义也不会太好. (4认同)
  • +1实际上回答问题并提供解释. (3认同)
  • @Griwes:代码确实有意义.说它不是不正确的.你是否建议错误答案比正确答案好? (3认同)

Sho*_*hoe 5

如果你想使用字符串,这里是一个更好的替代这个可怕的代码:

std::string str;
Run Code Online (Sandbox Code Playgroud)

或者,如果你真的想要一个包含10个字符的数组,你可以使用:

std::array<char, 10> arr;
arr.fill('\0');
Run Code Online (Sandbox Code Playgroud)

如果您想要一个最初包含10个字符的可调整大小的数组,请使用:

std::vector<char> vec(10, '\0');
Run Code Online (Sandbox Code Playgroud)