指针在C中被认为是通过引用调用的方法吗?

指针在C中被认为是通过引用调用的方法吗?,c,pointers,pass-by-reference,c++,C,Pointers,Pass By Reference,C++,在我大学的C编程课上,教授和她后来写的书在提到C中的指针时使用了调用或通过引用传递 我的教授认为是“引用调用函数”的一个例子: int sum(int *a, int *b); int sum(int a, int b); 我的教授将其视为“价值函数调用”的一个示例: int sum(int *a, int *b); int sum(int a, int b); 我知道C不支持通过引用调用。据我所知,指针通过值传递 基本上,说指针是C通过引用传递的方式是不正确的吗?如果说在C中不能通过引

在我大学的C编程课上,教授和她后来写的书在提到C中的指针时使用了调用或通过引用传递

我的教授认为是“引用调用函数”的一个例子:

int sum(int *a, int *b);
int sum(int a, int b);
我的教授将其视为“价值函数调用”的一个示例:

int sum(int *a, int *b);
int sum(int a, int b);
我知道C不支持通过引用调用。据我所知,指针通过值传递

基本上,说指针是C通过引用传递的方式是不正确的吗?如果说在C中不能通过引用传递,但可以使用指针作为替代方法,那是否更正确


2015年11月11日更新

从我提出问题的方式来看,我相信一场关于术语的辩论已经开始了,事实上,我看到了两个具体的区别

  • 通过引用传递(目前主要使用的术语):在C等语言中使用的特定的术语++
  • 顺便引用(我的教授用的术语作为解释指针的范例):在C++等语言之前使用的<>强>一般< /强>术语,因此在术语被改写
  • 之前
在阅读了@Haris更新的答案后,可以理解为什么这不是那么黑和白。

在C中不能通过引用传递,但可以使用指针作为替代

是的,没错


再详细一点。无论您将什么作为参数传递给c函数,它都只通过值传递。无论是变量的值还是变量地址

区别在于您发送的内容。

当我们通过值传递时,我们正在将变量的值传递给函数。当我们通过引用传递时,我们正在将变量的别名传递给函数。C可以将指针传递到函数中,但它仍然是按值传递的。它将指针的值(地址)复制到函数中


  • 如果发送变量的值,则函数只接收该值,更改该值不会影响原始值

  • 如果您发送变量的地址,那么也只发送值(本例中的地址),但由于您有变量的地址,因此可以使用它来更改原始值


作为例子,我们可以看到一些C++代码来理解按值调用和引用调用的实际区别。取自网站

在这种情况下,可以使用术语,p的值是对i的引用。如果是这样的话,那么如果我们将同一个指针(
int*p
)发送到一个函数,我们可以说,由于
i
的引用被发送到该函数,因此这可以称为按引用传递

因此,这是一个术语和看待场景的方式的问题

我不会完全不同意那个论点。但对于一个完全遵守书本和规则的人来说,这是错误的


注意:更新灵感来源于聊天。

来自C99标准(emphasis mine):

6.2.5类型

20可以从对象和函数类型构造任意数量的派生类型,如下所示 如下:

-指针类型可以从函数类型或对象类型派生,称为引用类型指针类型描述一个对象,其值提供对所引用类型实体的引用。从引用类型T派生的指针类型有时称为“指向T的指针”。从引用类型构造指针类型称为“指针类型派生”。指针类型是完整的对象类型

基于以上,你的教授所说的是有道理的,也是正确的。
指针按值传递给函数。如果指针指向有效实体,其值提供对实体的引用

此处引用是一个重载术语;一般来说,引用只是引用某事物的一种方式。指针指的是指向的对象,在C中,通过引用传递指针(通过值)是标准的方式

C++引入了引用类型作为表示引用的更好方式,并在技术英语中引入了歧义,因为我们现在可以使用术语“通过引用传递”来指代使用引用类型通过引用传递对象

在C++上下文中,前者使用的是IMO,表示不赞成。然而,我相信前一种用法在其他没有歧义的上下文(例如纯C)中很常见。

你的教授是对的。 通过值,它被复制。 通过引用,它不会被复制,引用说明了它的位置

通过值,您将int传递给函数,它被复制,对复制的更改不会影响原始值

通过引用,传递与指针相同的int,它不是复制的,而是修改原始的

通过引用,数组始终是通过引用的,您的数组中可能有10亿个项目,只说它在哪里更快,您正在修改原始项目。

不是真的

严格来说,C总是使用传递值。通过定义接受指针的函数,然后在调用时使用
&
操作符,您可以自己模拟按引用传递,当您将数组传递给函数时,编译器基本上会为您模拟它(通过传递指针,请参见问题6.4等)


另一种方法是如果一个参数的类型是,比如说,
int*
,那么一个整数就是通过引用传递的,一个指向整数的指针就是通过值传递的

从根本上说,C并没有真正等同于形式的按引用传递或引用参数
int main(void)
{
    int num1 = 5;
    int num2 = 10;

    int *pnum1 = &num1;
    int *pnum2 = &num2;
    int ptemp;

    printf("Before swap, *Pnum1 = %d and *pnum2 = %d\n", *pnum1, *pnum2);
    temp = pnum1;
    pnum1 = pnum2;
    pnum2 = ptemp;

    printf("After swap, *Pnum1 = %d and *pnum2 = %d\n", *pnum1, *pnum2);
}
void swap(int *pnum1, int *pnum2)
{
     int *ptemp = pnum1;
     pnum1 = pnum2;
     pnum2 = temp;
}

int main(void)
{
    int num1 = 5;
    int num2 = 10;

    int *pnum1 = &num1;
    int *pnum2 = &num2;

    printf("Before swap, *pnum1 = %d and *pnum2 = %d\n", *pnum1, *pnum2);
    swap(pnum1, pnum2);

    printf("After swap, *pnum1 = %d and *pnum2 = %d\n", *pnum1, *pnum2);
}
// C               // C#
int x=0;           int x=0;
foo(&x);           foo(ref x);
x++;               x++;
bar();             bar();
x++;               x++;
boz(x);            boz(x);