在这个程序中我通过函数指针访问全局 char数组,用地址按字母指针更改字符串值会使全局字符数组有所不同,但是将字符串更改为整个字符串时,它在全局数组
中没有任何区别#include <stdio.h>
#include <string.h>
void function(char *string);
char str[20] = "Hello"; // global char array
int main()
{
function(str);
return 0;
}
void function(char *string)
{
int i;
printf("%s\n",string);
printf("%s\n", str);
for(i = 0;i < strlen(string);i++)
string[i] = 'a';
printf("%s\n",string);
printf("%s\n", str);
string = "jhony";
printf("%s\n",string);
printf("%s\n",str); // here is the doubt
}
输出
Hello
Hello
aaaaa
aaaaa
jhony
aaaaa //how this supposed to print aaaaa even after we changed string into jhony
答案 0 :(得分:2)
string = "jhony";
不会将"jhony"
复制到string
指向的内存中。相反,它会将"jhony"
的地址分配给string
。
在此之后,string
指向"jhony"
,而str
保持不变。
正如@BrianCain所评论的,要将"jhonny"
复制到string
寻址的内存,您可以使用
strcpy(string, "jhonny");
答案 1 :(得分:1)
这是因为string是一个局部变量。当您设置string = jhony
时,您没有更改str。您只需更改字符串指向的内容。在此之后定义了两个字符串常量,“aaaaa”和“jhony”,aaaaa字符串不会被覆盖。 Str仍然是“aaaaa”,因为它没有被johnny赋值给字符串。
答案 2 :(得分:1)
string和str都是指向同一个东西的不同指针。使用数组 符号与解除引用相同,因此您实际操作基础数据,因为它们指向同一事物,两个地方都注意到了变化。
当您将指针设置为等于文字时,没有任何解除引用或数组表示法。这改变了指针所指向的内容,但未触及基础数据。所以其他指针没有注意到这种变化。
将指针设置为某个值会改变其值,因为指针的值是一个地址。该地址是对指针所指向的引用,但现在指针指向新地址。在您的情况下,字符串文字。
答案 3 :(得分:0)
string = "jhony";
这个语句改变了字符串的值,这意味着变量字符串不再指向全局数组,它现在指向新的const字符串&#34; johny&#34;存储在函数堆栈中的