void func(char *ptr) //Passed by reference
{
*ptr = 'B';
}
int main()
{
char *ptr;
ptr = (char *) malloc(sizeof(char) * 1);
*ptr = 'A';
printf("%c\n", *ptr);
func(ptr);
printf("%c\n", *ptr);
}
我很困惑我知道ptr=(char*)malloc (sizeof(char*1)
这意味着分配1个字节并返回指向分配的指针然后分配给ptr
,所以ptr
是一个指针。
但是当它调用func(ptr)
时为什么不使用&
?虽然我想要的是改变ptr
点内的角色?为什么不在此处使用void func(char** ptr)
并发送func(&ptr)
?有可能吗?
我的意思是通过引用传递了什么?
第二个代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *c=NULL;
test(c);
printf("after test string is %s\n",c);
return 0;
}
void test (char *a)
{
a=(char*)malloc(sizeof(char)*6);
a="test";
printf("inside test string is %s\n",a);
}
答案 0 :(得分:1)
当您使用func
作为参数致电ptr
时,您实际上正在传递char*
(因为ptr
是char*
)。
如果您要使用func(&ptr)
,您将指针传递给指针(此处为char**
),但func需要指向char(char*
)的指针。
您可以使用void func(char**)
和func(&ptr)
,但这只会添加&#34;指针层&#34;似乎没有理由(因为在func中你想要访问你必须要做的内容**ptr
)。
调用是通过引用传递的,因为您传入一个指针(保存另一个变量的内存中的地址的变量)而不是值(变量本身)。
答案 1 :(得分:1)
在C中,实际上没有“通过引用传递”这样的东西。所有参数都通过值传递 - 作为副本分配到局部变量 - 参数。给定像
这样的函数void func(char *ptr);
传入的值是char *
- 指向char
的指针,在函数内,ptr
中存储的值是调用函数中原始值的副本,这样在调用者外面看不到调用者内ptr
本身值的变化。
但该指针的值 - 如果它是有效的 - 也是类型为char
的对象的引用 - 或类型为{{1}的数组的元素}。在您的情况下,它是指向动态分配的1个字符数组的第一个元素的指针。因此,您确实传入了 - 通过值 - 对char[]
类型的对象的引用。
如果您使用char
函数原型需要
func(&ptr);
也就是说,参数必须是指向void func(char **ptr);
指针的指针。如果您使用char
取消引用值一次,则会获得类型为*ptr
的左值(定位符值);你可以修改它,好像它是一个变量。或者,您也可以取消引用该指针值 - 即char *
以获得**ptr
类型的lvalue
。
但是,对于您的函数,如果您只想修改存储的char
,则更改不会有所帮助,而是使您的代码使用起来更复杂,就像您一样现在需要一个类型为char
的有效对象,其地址将被传递给函数;使用char *
,您只需要一个void func(char *ptr)
类型的有效对象。
答案 2 :(得分:0)
当然可以执行void func( char** ptr )
并使用func( &ptr )
调用它,但是你不会(仅)通过引用传递字符,你将通过引用传递指针。因此,为了更改角色,您需要在**ptr = 'B';
内进行func()
。
但是,如果您想要做的就是更改ptr指向的字符,那么额外的间接级别不会给您带来任何好处。
如果您计划更改指针指向的地址,则可以使用void func( char** ptr )
。这看起来像这样:
char b;
void func( char** ptr )
{
*ptr = &b;
}