2014-07-20 59 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++結構和定義的理解。我認爲問題不在於這個問題,而在於你。 –