C和*之间有什么区别?

Cri*_*ron 3 c c++ pointers dereference

我正在学习C和我仍然不知道如果我的理解之间的差异&*呢.

请允许我试着解释一下:

int a; // Declares a variable
int *b; // Declares a pointer
int &c; // Not possible

a = 10;
b = &a; // b gets the address of a
*b = 20; // a now has the value 20
Run Code Online (Sandbox Code Playgroud)

我得到了这些,但后来变得令人困惑.

void funct(int a) // A declaration of a function, a is declared
void funct(int *a) // a is declared as a pointer
void funct(int &a) // a now receives only pointers (address)

funct(a) // Creates a copy of a
funct(*a) // Uses a pointer, can create a pointer of a pointer in some cases
funct(&a) // Sends an address of a pointer
Run Code Online (Sandbox Code Playgroud)

所以,无论是funct(*a)funct(&a)是正确的,对不对?有什么不同?

eml*_*lai 18

*&作为类型修饰符

  • int i 声明一个int.
  • int* p声明一个指向 int 的指针.
  • int& r = i声明对int 的引用,并将其初始化为引用i.
    仅限C++.请注意,必须在初始化时分配引用,因此int& r;无法进行引用.

同理:

  • void foo(int i) 声明一个带int的函数(按值,即作为副本).
  • void foo(int* p) 声明一个函数获取指向int的指针.
  • void foo(int& r)声明一个通过引用获取int的函数.(再次,仅限C++)

*&作为运营商

  • foo(i)电话foo(int i).该参数作为副本传递.
  • foo(*p)取消引用int指针pfoo(int i)使用指向的int 调用p.
  • foo(&i)获取int的地址ifoo(int* i)使用该地址调用.

(tl; dr)总而言之,取决于具体情况:


tsk*_*zzy 6

void funct(int &a)声明一个接受引用的函数。引用在概念上是一个指针,因为函数可以修改传入的变量,但在语法上像值一样使用(因此您不必始终取消引用它来使用它)。


Mic*_*Van 6

funct(int a) 
Run Code Online (Sandbox Code Playgroud)

创建一个.的副本

funct(int* a) 
Run Code Online (Sandbox Code Playgroud)

将指向int的指针作为输入.但是制作指针的副本.

funct(int& a)
Run Code Online (Sandbox Code Playgroud)

采用int,但通过引用.a现在与给出的int完全相同.不是副本.不是指针.


Pra*_*tic 5

最初在 C 中有指针而没有引用。很多时候,尽管我们只想访问一个值而不复制它,而且我们传递的是地址而不是实际值的事实是一个不重要的细节。

C++ 引入了引用来抽象掉指针的管道。如果你想在 C++ 中“显示”一个函数的值,那么引用是可取的。该函数保证引用不为空,并且可以像访问值本身一样访问它。指针对于其他目的仍然是必要的,例如,您可以“重新瞄准”指针或delete使用指针,但不能使用引用来这样做。

它们的功能确实有重叠,如果没有一点历史,您应该会混淆我们两者都有。

因此,您直接问题的答案是,通常没有区别。也就是说,f(int*)如果您希望函数能够检查指针是否为空,这将很有用。如果您使用 C,那么指针是唯一的选择。


Cli*_*ord 5

的含义*取决于上下文。当一个数据或功能参数声明,它是一种数据类型预选赛中,没有一个运营商 int*本身就是一种数据类型。出于这个原因,编写以下内容可能很有用:

int* x ;
Run Code Online (Sandbox Code Playgroud)

而不是:

int *x ;
Run Code Online (Sandbox Code Playgroud)

它们是相同的,但第一种形式强调它*是类型名称的一部分,并在视觉上将其与作为解引用运算符的用法区分开来。

当应用于实例化的指针变量时,它是解引用运算符,并产生指向的值。

&在 C 中只是一个运算符,它产生对象的地址(或指向 的指针)。它不能在声明中使用。在 C++ 中,它引用的类型限定符,类似于指针,但具有更多限制性行为,因此通常更安全。

您在此处的评论中的建议:

funct(&a) // Sends an address of a pointer
Run Code Online (Sandbox Code Playgroud)

是不正确的。的地址a被传递;那只会是“指针的地址a本身就是一个指针。指针地址。类型的的指针的地址intint**(一个指针的指针)。

也许有必要解释一下指针和值变量的基本原理?甲指针描述所述位置中一个变量的存储器,而一个描述的存储器位置的内容。

  • <typename>*是指向<typename>数据类型的指针。
  • &*<value-variable>产生<variable>(即指向<variable>)的地址或位置,
  • **<pointer-variable>取消引用一个指针以产生该指针表示的地址处的值。

所以举个例子:

int a = 10 ;
int* pa = &a ; 
Run Code Online (Sandbox Code Playgroud)

然后

*pa == 10
Run Code Online (Sandbox Code Playgroud)