繁体   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