2014-07-20 127 views
-7
char charArray[10]; 
char* pArray = charArray; 
for(int i = 0; i < 10; i++) 
{ 
*pArray = '\0'; 
pArray++; 
} 

从这个片段,什么* pArray ='\ 0';意思? 我无法理解这一点。For循环指针和终止空

+5

这不是一个基于范围的for循环。 – rightfold

+3

这是可怕的,可怕的,可怕的代码。甚至不要看它。不必要的'char'数组而不是字符串,不必要的数组指针,不必要的循环,不必要的'\ 0'重置。这太糟糕了。只是远离谁写的。 – Shoe

+1

是我还是这整个片段可能只是'char charArray [10] = {0};'? – Borgleader

回答

3

字符文字'\0'是一个NUL字符,其值为0x00。该循环将数组清零。

5

下面是那可怕的代码更好的选择,如果你想使用字符串:

std::string str; 

另外,如果你真的想的10个字符数组,你可以使用:

std::array<char, 10> arr; 
arr.fill('\0'); 

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

std::vector<char> vec(10, '\0'); 
10

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

char* pArray = charArray; 

所以在循环内,在第一次迭代中产生*pArray参考阵列的第一个字符。因此引用的字符由字符字面值'\ 0'分配。

*pArray = '\0'; 

然后指针incermented

pArray++; 

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

可以这样做在数组定义

char charArray[10] = {}; 

要简单得多。在这种情况下数组中的所有10个字符将被“\ 0”进行初始化。

在C的等效结构将如下

char charArray[10] = { '\0' }; 

考虑到的是,如果可变粒子阵列只需要在循环内初始化数组的元素那么最好是写循环以下方式(如果你想用一个指针):

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

for (char *pArray = charArray; pArray != charArray + N; ++pArray) 
{ 
    *pArray = '\0'; 
} 

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

例如

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

std::fill(charArray, charArray + N, '\0'); 

或者你可以使用标准的功能std::beginstd::end指定第一和阵列FOT最后一个迭代器。

+3

+1实际上回答问题并提供解释。 –

+1

这回答这个问题的字面意思,但回答问题从字面上看,这样的可怕的问题几乎没有意义。 – Griwes

+4

@Griwes这不是一个可怕的问题。答案很有意义,因为它回答了问题并给出了对C++结构和定义的理解。我认为问题不在于这个问题,而在于你。 –