通过引用了解函数的指针传递指针

时间:2017-06-11 09:23:40

标签: c pointers

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);
}

3 个答案:

答案 0 :(得分:1)

当您使用func作为参数致电ptr时,您实际上正在传递char*(因为ptrchar*)。

如果您要使用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;
}