C用指针传递值或引用

C用指针传递值或引用,c,function,pointers,reference,C,Function,Pointers,Reference,哪些函数调用是通过值传递的,哪些是通过引用传递的 int *a; int b; int **c; f(a); g(&b); h(*c); 仅仅是简单的例子,我对指针以及如何告诉它们是如何传递的感到困惑。为了让问题更清楚,让我们初始化变量 int b; int *a = &b; int **c = &a; 那么这个电话 f(a); 通过指针a通过引用传递对象b。指针本身由一个值传递,该值是处理指针a值副本的函数 这个电话 g(&b); 事实上,

哪些函数调用是通过值传递的,哪些是通过引用传递的

int *a;

int b;

int **c;

f(a);

g(&b);

h(*c);

仅仅是简单的例子,我对指针以及如何告诉它们是如何传递的感到困惑。

为了让问题更清楚,让我们初始化变量

int b;

int *a = &b;

int **c = &a;
那么这个电话

f(a);
通过指针
a
通过引用传递对象
b
。指针本身由一个值传递,该值是处理指针
a
值副本的函数

这个电话

g(&b);
事实上,它相当于相对于接受值的上一次调用。变量
b
通过引用传递

而这个调用也相当于上一个调用

h(*c);
变量
b
通过指针
*c
通过引用传递,其值等于指针
a
的值


因此,这三个函数都通过引用接受变量
b

学究式的回答是,它们都是通过值传递的,但有时该值是一个地址

更有用的是,假设这里没有错误,所有这些函数都是按地址传递的,这与C获得的按引用传递一样接近。它们将指针作为参数,并且可以取消引用该指针以将数据写入它所指向的任何位置。只有对g()的调用才是安全的,因为其他指针没有定义

这是不需要重新分配的输入/输出参数的标准C API

需要返回新的可变大小缓冲区的函数通常会接收指向指针的指针,因此它们可能会取消引用该参数,以获取调用方中的地址,在调用方中,它们会向该地址写入指向所分配缓冲区的指针,或者该地址是函数的静态变量


正如注释中提到的,可以从函数返回指针。没有它,内存分配在C中就无法工作。但仍然很常见的情况是,函数具有size\t**参数或类似的参数来返回指针。这可能主要是一种Unix模式,其中几乎每个函数都返回一个成功/错误代码,因此实际的函数输出会转移到参数上。

正式地说,C没有按引用传递。它只有传递值

可以通过以下两种方式模拟按引用传递:

  • 您可以将函数参数声明为指针,并显式使用
    &
    将指针传递给调用者中的对象
  • 您可以将函数参数声明为指针并传递数组,因为当您尝试传递数组时,实际发生的情况是数组的值“衰减”为指向其第一个元素的指针。(您还可以将函数参数声明为数组,使其看起来更像是传递了一个数组,但实际上您在任何情况下都声明了一个指针。)
所以这更多的是一个问题,您认为哪些参数是通过引用传递的


你经常会听到它说“数组在C中是通过引用传递的”,这不是错的,但可以说这也不是严格正确的,因为(如前所述)实际发生的情况是,指向数组第一个元素的指针是通过值传递的。

最简单的判断方法是通过算术的大小,但是
char
类型并非如此。对于地址运算,将调用
sizeof运算符
,这与
unsigned int
类型中的普通运算不同

#include <iostream>
using namespace std;

int main() {
    unsigned int ui, *uiPtr;

    ui = 11;
    cout << ui << endl;
    ui += 1; //increases value by 1
    cout << ui << endl;
    uiPtr = &ui;
    cout << uiPtr << endl;
    uiPtr += 1; //increases value by sizeof
    cout << uiPtr << endl;

    return 0;
}
#包括
使用名称空间std;
int main(){
未签名的int-ui,*uiPtr;
ui=11;

在C中,所有函数参数都是按值传递的。只是有些值可能是指针。所以所有这些都是按值传递的?形式上,C没有按引用传递。它只有按值传递。如果显式传递指针,可以模拟按引用传递(或者,如果您通过尝试传递数组并将数组的值衰减为指向其第一个元素的指针来隐式传递指针,则这是事实)。因此,这更多的是一个你认为哪些参数是通过引用传递的问题。是的,它们都通过值传递一个
int*
。好的,谢谢,但这不意味着它是通过引用传递的吗?通过引用传递数组:如果这是完全正确的,那么
sizeof(arrayParameter)
会产生数组的大小,而不是指针的大小,不是吗?@Jolly\u吉米:别被我的评论搞糊涂了,它会产生指针的大小!也许值得一提的是,我们不一定需要out参数作为指针到指针,但也可以简单地返回普通指针。。。