2016-11-12 57 views
1

我不完全理解這個,有人可以幫我評估下面的表達式嗎?如果信息有**且長度只有*,則使用*() 我們是否解除引用*messagelength?任何幫助將非常感激。C如何評估這個表達式? C指針

bool func(char** message, size_t* length) 
    { 
     *(*message + *length) = '\0'; 
    } 

回答

2

*(a + b)是寫a[b]的另一種方式。上面的語句等價於

(*message)[*length] = '\0'; 

*messagechar*字符串,*length是一個大小。它將索引*length中的字符設置爲NUL。

指針的額外層沒有特別的原因。這將是更垂直於除去從每個參數的一個*和具有的功能是:

bool func(char* message, size_t length) 
{ 
    *(message + length) = '\0'; 
} 

或者,換句話說,

bool func(char* message, size_t length) 
{ 
    message[length] = '\0'; 
} 
0

部分的括號內計算一個地址,然後將NUL被存儲在該地址。

讓我們來解開它

char *ptr = *message; // derefernce the pointer to pointer 
size_t len = *length; // get the length by derefencing the pointer 
char * new_ptr = ptr + len; 
*new_ptr = '\0'; 
0

message是一個指針的指針字節塊(實際上是一個字符串)。 length是指向size_t(某種非負整數)的指針。表達被解碼如下:

*message是一個指向字符串

*length是一個數字,在該length所指向的值,可能是字符串所需的長度,或者長度在該字符串將被截斷(從整個表達式行爲判斷)

*message + *length是在aritmethic指針,指向某些位置是*length字節遠離串的開始的指針

*(*message + *length)正在解引用指針。這是我們指向的實際角色。

*(*message + *length) = '\0'這是在該位置存儲一個NUL字節,因此終止字符串。

功能可以改寫爲本,以提高可讀性:

bool func(char** message, size_t* length) 
{ 
    size_t len = *length; 
    char *msg = *message; 

    msg[len] = '\0'; 
}