簡體   English   中英

C中的字符串指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM