C 在这种情况下如何通过引用传递?
我尝试使用C 在这种情况下如何通过引用传递?,c,pointers,pass-by-reference,C,Pointers,Pass By Reference,我尝试使用change()函数更改y的内容。 我想问,当我将x分配给“abc”时,当我删除*时,为什么y不能更改 另外,我发现&*x与&y相同,这是否意味着指针x的地址被分配为与*y指向的内容的地址相同?还有,为什么&x不等于“abc” 我的代码: 它应该是change(y)notchange(&y),change(&y)是*y的地址,而不是y中的地址。所以y给出了字符串中第一个字符的地址,其中&y给出了y的地址,而不是第一个字符串的地址 它应该是change(y)notchange(&y),c
change()
函数更改y
的内容。
我想问,当我将x
分配给“abc”
时,当我删除*
时,为什么y
不能更改
另外,我发现&*x
与&y
相同,这是否意味着指针x
的地址被分配为与*y
指向的内容的地址相同?还有,为什么&x
不等于“abc”
我的代码:
它应该是change(y)
notchange(&y)
,change(&y)
是*y
的地址,而不是y中的地址。所以y给出了字符串中第一个字符的地址,其中&y给出了y的地址,而不是第一个字符串的地址
它应该是change(y)
notchange(&y)
,change(&y)
是*y的地址,而不是y中的地址。所以y给出了字符串中第一个字符的地址,其中&y给出了y的地址,而不是第一个字符串的地址
嗯
为什么&x不等于“abc”
因为&x
给出的是x的地址,而不是它所指向的值。要获得值,您需要*x
y
无法更改,因为它指向常量字符串文本。任何试图改变它的行为都会导致UB
这是否意味着指针x的地址被指定为与*y指向的内容的地址相同
当您将y
的地址作为参数传入函数时,指针x
具有指针y
的地址
为什么&x不等于“abc”
因为&x
给出的是x的地址,而不是它所指向的值。要获得值,您需要*x
y
无法更改,因为它指向常量字符串文本。任何试图改变它的行为都会导致UB
这是否意味着指针x的地址被指定为与*y指向的内容的地址相同
指针x
具有指针y
的地址,当您将y
的地址作为参数传入函数时。您的代码中存在许多问题,请指出其中的一些问题
y
指向字符串文本。任何修改字符串文字的尝试都是无效的
若要打印地址,请使用%p
格式说明符,并对参数强制转换为(void*)
,使用不正确的参数类型是错误的。同样,要打印字符
,您需要%c
,要打印字符串,您需要%s
。阅读更多
在change()
函数中,*x
的类型为char
,您试图为其分配一个指针(字符串文本的基址“abc”
)
够了!!让你的编译器告诉你剩下的。(换句话说,请启用编译器警告并尝试修复报告的问题。)您的代码中有许多问题,请指出其中的一些问题
y
指向字符串文本。任何修改字符串文字的尝试都是无效的
若要打印地址,请使用%p
格式说明符,并对参数强制转换为(void*)
,使用不正确的参数类型是错误的。同样,要打印字符
,您需要%c
,要打印字符串,您需要%s
。阅读更多
在change()
函数中,*x
的类型为char
,您试图为其分配一个指针(字符串文本的基址“abc”
)
够了!!让你的编译器告诉你剩下的。(换句话说,请启用编译器警告并尝试修复报告的问题。)您必须阅读有关指针和参数传递的更多信息。
指针是一个变量,它在内存中保存另一个变量的地址。
当您在代码中引用变量时,编译器使用该变量的值,因此,当您引用指针时,您将获得其内容,即地址
运算符&
返回变量的地址,因此在代码段中:
int a = 10;
int *p = &a;
指针p
将保存变量a
的内存地址。如果我们在p
上使用操作符*
,我们将获得a
所持有的内存地址的内容:
printf("%d", *p);
将打印10
如果我们写&*p
,虽然它不是完全正确的,而且许多编译器甚至会发出警告,但我们得到的是指针指向的值,而不是要求该内容的地址,也就是说,返回作为指针内容的数据地址
现在是函数,当您在函数中传递一个参数时,变量的一个副本被推送到堆栈上,从该堆栈中可以访问函数。
这些值是本地值,当您离开函数时,对它们所做的任何更改都将丢失。当然,如果您传递一个指针,即变量的地址,然后使用指针更改值,您可以在实际变量上反映更改
但是,当您在函数proto中声明指向char的指针时,代码中出现了一个大错误:
void change(char *x)
您正在传递更改(&y)
是char**
(y
是char*
,&y
是char**
)。你应该得到很多警告。
无论如何,调用方的概念是正确的,您传递存储字符串地址的地址,更改它将指向新字符串。这是完全合法的,因为您正在使用另一个常量字符串更新指针(而不是更改非法的常量字符串)。
但是您需要字符串指针的地址,您的函数必须是:
void change(char **x)
{
*x = "abc";
printf("S3: %p\n", (void *)&x);
printf("S4: %p\n", (void *)&*x);
}
int main(int argc, char *argv[])
{
char *y = "def";
printf("S1: %p\n", (void *)&y);
printf("S2: %p\n", &*y);
change(&y);
printf("result: %s\n", y);
return 0;
}
最后在printf
中为poi使用正确的格式
void change(char **x)
{
*x = "abc";
printf("S3: %p\n", (void *)&x);
printf("S4: %p\n", (void *)&*x);
}
int main(int argc, char *argv[])
{
char *y = "def";
printf("S1: %p\n", (void *)&y);
printf("S2: %p\n", &*y);
change(&y);
printf("result: %s\n", y);
return 0;
}