15

我对 C 中的指针有一些基本的误解,这应该很简单,但搜索什么也没有。我不明白以下代码的行为;

#include <stdlib.h>
#include <stdio.h>

void my_function(char *);

int main(int argc, char *argv[]) {
    char *ptr;
    ptr = malloc(10);

    if(ptr != NULL) printf("FIRST TEST: ptr is not null\n");
    else printf("FIRST TEST: ptr is null\n");

    my_function(ptr);

    if(ptr != NULL) printf("SECOND TEST: ptr is not null\n");
    else printf("SECOND TEST: ptr is null\n");
}

void my_function(char *a) {
    a = NULL;
}

哪些输出;

FIRST TEST: ptr is not null
SECOND TEST: ptr is not null

为什么第二个测试仍然看到指针不为 NULL?我正在尝试使用 NULL 指针分配作为一种“返回标志”来指示函数的某种失败。但是在之后测试指针时,它似乎不是 NULL。

4

6 回答 6

38

这是因为指针是按值传递的,而不是按引用传递的。如果要更改函数内部的指针,则需要将实际指针作为指针传递,即指向指针的指针:

void my_function(char **a)
{
    *a = NULL;
}

调用函数时使用 address-of 运算符&来获取指针的地址:

my_function(&ptr);
于 2013-04-30T12:01:51.097 回答
7

a=NULL您的 in语句my_function()确实设置了ato的值NULL,但a它是该函数的局部变量。当您传递ptrmy_function()in 时main(),该值ptr被复制到a.我想您的整个混淆是由于*之前a在定义中使用的my_function()

当我们想要从被调用函数中操作这些指针指向的原始值时,通常会将指针传递给函数,而这是由dereferencing来自被调用函数的那些指针完成的。在这种情况下,您是否使用过:

*a= blah blah;

它会反映在 in 指向的地址的值ptrmain()。但是由于您想更改其自身的值,因此ptr您需要能够manipulatemy_function().将这样的as 参数传递给并使用它来更改.Here 的代码的变体,它将为您执行此操作:pointer-to-pointerchar**char**my_function(()ptr

#include <stdlib.h>
#include <stdio.h>

void my_function(char **); // Change char* to char**

int main(int argc, char *argv[]) {
    char *ptr;
    ptr = malloc(10);

    if(ptr != NULL) printf("FIRST TEST: ptr is not null\n");
    else printf("FIRST TEST: ptr is null\n");

    my_function(&ptr); //You pass a char**

    if(ptr != NULL) printf("SECOND TEST: ptr is not null\n");
    else printf("SECOND TEST: ptr is null\n");
}

void my_function(char **a) {  //Change char* to char** here
    *a = NULL;
}
于 2013-04-30T12:28:42.343 回答
3

在 C 中,像这样的函数调用foo(a)永远不会改变 a 的值。

于 2013-04-30T12:04:39.273 回答
1

char** a如果您想修改它所指向的内容,您的函数应该采用 a 。这是因为指针被复制为函数的参数,这意味着您在内部对其进行的任何更改都不会在函数外部看到,因为它正在修改副本。

如果要更改它并在函数范围之外看到它,则需要添加另一个间接。

于 2013-04-30T12:02:20.100 回答
0

您的问题是,my_pointer它不会写入指针ptr,而是它的副本,*a.

您需要将ptrdo 的地址传递给您想要的。

于 2013-04-30T12:04:51.753 回答
0

将指针传递给函数时,指针被复制到函数范围内。如果你想做这样的事情,你需要使用指针的指针。指针基本上只是一个整数/长整数

于 2013-04-30T12:03:12.470 回答