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