我误解了关于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。
答案 0 :(得分:31)
这是因为指针是按值传递的,而不是通过引用传递的。如果要更改函数内部的指针,则需要将实际指针作为指针传递,即指向指针的指针:
void my_function(char **a)
{
*a = NULL;
}
在调用函数获取指针的地址时,使用address-of operator &
:
my_function(&ptr);
答案 1 :(得分:6)
a=NULL
中的my_function()
语句确实将a
的值设置为NULL
,但a
是该函数的局部变量。当您通过时ptr
中的my_function()
到main()
,ptr
的值已复制到a
。我想您的整个混淆来自之前使用过的*
a
的定义中my_function()
。
当我们想要从被调用函数中操纵这些指针所指向的原始值时,指针通常被传递给函数,这是由dereferencing
来自被调用函数的那些指针完成的。在这种情况下,有你用过这个:
*a= blah blah;
它会反映在ptr
中main()
指向的地址的值中。但由于您想要更改ptr
本身的值,您需要能够可以从manipulate
my_function()
开始pointer-to-pointer
。为此,您使用char**
,即char**
类型。您将my_function(()
作为参数传递给{ {1}}并使用它来更改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;
}
答案 2 :(得分:2)
在C中,像foo(a)
这样的函数调用永远不会改变a。
答案 3 :(得分:1)
如果要修改指向的内容,您的函数应该char** a
。这是因为指针被复制作为函数的参数,这意味着你在函数之外的任何更改都不会在函数外部看到,因为它修改了一个副本。
如果要更改它并在功能范围之外查看它,则需要添加另一个间接。
答案 4 :(得分:0)
将指针传递给函数时,指针被复制到函数范围中。如果你想做这样的事情,你需要使用指针指针。指针基本上只是一个整数/长
答案 5 :(得分:0)
你的问题是,my_pointer得到的不是写指针“ptr”,而是它的副本“* a”。
您需要将“ptr”的地址传递给您想要的内容。