Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;传递给函数的空指针_C++_Pointers - Fatal编程技术网

C++ c++;传递给函数的空指针

C++ c++;传递给函数的空指针,c++,pointers,C++,Pointers,我希望看到b=3被打印出来,但是,它是一个SIGSEGV。我想知道为什么即使我在side foo()中将b指向a,b也不指向任何东西?C++按值复制。这意味着,在变量通过参数传递后,实际上只复制变量的值。函数内部的b只是主函数中b的一个副本,一旦函数结束就会消失 如果要对实际值进行操作,必须使用引用。使用int*&作为类型以获取“指向int类型指针的引用”。引用保留在函数内部发生的状态更改,并将更改main()中b的值 但是,建议您不要这样做。如果您打算将函数定义为函数意义上的函数,而不是过程子

我希望看到b=3被打印出来,但是,它是一个SIGSEGV。我想知道为什么即使我在side foo()中将b指向a,b也不指向任何东西?

C++按值复制。这意味着,在变量通过参数传递后,实际上只复制变量的值。函数内部的
b
只是主函数中
b
的一个副本,一旦函数结束就会消失

如果要对实际值进行操作,必须使用引用。使用
int*&
作为类型以获取“指向int类型指针的引用”。引用保留在函数内部发生的状态更改,并将更改
main()
b
的值


但是,建议您不要这样做。如果您打算将函数定义为函数意义上的函数,而不是过程子例程,那么让函数修改状态可能被认为是一种糟糕的风格。原因是,如果不鼓励操作现有的类型系统,就无法真正明确区分哪些函数更改其输入。

foo
不会更改指针。首先,因为它获取指针的副本。要更改指针,您需要指定指针或引用。像这样:
voidfoo(int*a,int*&b)
。第二,它根本不需要为
b
分配任何内容。此外,您也无法获取SIGSEGV,因为代码甚至不会编译为such@SamiKuhmonen@VermillionAzure代码被修改了。现在当然可以了。
void foo(int* a, int* b){
    b=a;
}

int main(int argc, char** argv)
{
    int* a=new int(3);
    int* b=NULL;
    foo(a, b);

    printf("b=%d\n", *b);
}