[英]Pointers of strings in C
在下面的情況下。 更改字符串 'out' 會分別更改字符串 'str' 嗎? 換句話說,它們是否具有相同的指針?
先感謝您。
int main() {
char str[]={'g','o','o','d','/0'};
char special[]={'o','/0'};
char* out=str;
return 0;
}
這取決於。 如果你寫:
out = "hello!";
你不改變字符串str
,而只是做out
點到另一個存儲位置。
但是如果你像這樣寫out
:
sprintf(out, "abcd");
那么你確實改變了str
。 但要小心溢出!
對於初學者,我認為您的意思是終止零'\\0'
而不是多字節字符文字 '/0'。
為了避免這樣的錯誤,最好用字符串文字初始化字符數組(如果你打算在數組中存儲一個字符串)。 例如
char str[] = { "good" };
或者就像
char str[] = "good";
至於這個任務之后的問題
char* out=str;
指針out
指向數組str
的第一個字符。 因此,使用此指針和指針算法,您可以更改數組。 例如
char str[] = "good";
char *out = str;
out[0] = 'G';
*( out + 3 ) = 'D';
puts( str );
此外,作為參數傳遞給函數的數組被隱式轉換為指向其第一個字符的指針。 因此,您可以交替使用數組本身作為參數或由數組指示符初始化的指針。 例如
#include <stdio.h>
#include <string.h>
//...
char str[] = "good";
char *out = str;
size_t n1 = strlen( str );
size_t n2 = strlen( out );
printf( "n1 == n2 is %s\n", n1 == n2 ? "true" : "false" );
此代碼片段的輸出為true
。
但是,有一個重要的區別。 數組的大小是分配給其所有元素的字節數,而指針的大小通常根據使用的系統等於 4 或 8,並且不依賴於數組中的元素數。 那是
sizeof( str ) is equal to 5
sizeof( out ) is equal to 4 or 8
考慮到根據 C 標准,沒有參數的函數 main 應聲明為
int main( void )
我認為您的代碼中有一個錯字,您寫了'/0'
但它不是空字符,而是'\\0'
。 就out
& str
而言, str[]
是一個字符數組,而out
是指向它的指針。 如果你做out
點其他一些char array
就會有沒有影響str
。 但是您可以使用out
指針來更改str[]
內的值,如下所示,
int main( void )
{
char str[]={'g','o','o','d','\0'}; // There was a typo, you wrote '/0', I guess you meant '\0'
//char special[]={'o','\0'};
char* out=str;
for(int i=0; out[i] != '\0'; i++)
{
out[i] = 'a';
// This will write 'a' to the str[]
}
printf("out: %s\n", out);
printf("str: %s", str);
return 0;
}
不, out
是一個不同的變量,它保存着str
所在的相同地址,即它指向相同的位置。 請注意,更改*str
將更改*out
。
在 C 中,賦值取右端的值並將其存儲在左端,它不會使右“變成”左
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.