lyn*_*nks 11 c pointers function
我误解了关于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;
}
Run Code Online (Sandbox Code Playgroud)
哪些产出;
FIRST TEST: ptr is not null
SECOND TEST: ptr is not null
Run Code Online (Sandbox Code Playgroud)
为什么第二个测试仍然看到指针不是NULL?我试图使用NULL指针赋值作为一种'返回标志'来指示函数的某个失败.但是在之后测试指针时,它似乎不是NULL.
Som*_*ude 32
这是因为指针是按值传递的,而不是通过引用传递的.如果要更改函数内部的指针,则需要将实际指针作为指针传递,即指向指针的指针:
void my_function(char **a)
{
*a = NULL;
}
Run Code Online (Sandbox Code Playgroud)
&调用函数时使用address-of运算符来获取指针的地址:
my_function(&ptr);
Run Code Online (Sandbox Code Playgroud)
你的声明a=NULL中my_function()确实设置的值a来NULL,但a就是功能.当你传递的局部变量ptr,以my_function()中main(),价值ptr被复制到a.I假设你的整个混乱从产生*使用之前a的定义my_function().
当我们想要从被调用函数中操纵那些指针所指向的原始值时,指针通常被传递给函数,这是由dereferencing来自被调用函数的那些指针完成的.在这种情况下,你使用过这个:
*a= blah blah;
Run Code Online (Sandbox Code Playgroud)
它会反映在地址指向的值ptr的main().但既然你想改变的价值ptr本身,你需要能够有办法manipulate从它my_function().对于这一点,你使用pointer-to-pointer,即类型char**.您传递这样一个char**参数my_function(()并使用它来改变ptr.Here的值是你的代码的变化,它会为你做的:
#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;
}
Run Code Online (Sandbox Code Playgroud)