Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.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#程序员和使用_C++ - Fatal编程技术网

c++;-指针和引用:一个简单的例子 我正在通过C++书籍/指南工作,但是指针和参考文献对我来说似乎有些模糊。这是我作为一名C#程序员和使用

c++;-指针和引用:一个简单的例子 我正在通过C++书籍/指南工作,但是指针和参考文献对我来说似乎有些模糊。这是我作为一名C#程序员和使用,c++,C++,foo(参考整数x)和bar(参考整数y) 我写了一小段代码来显示内存位置和内存位置值,但我不完全理解它们的含义,以及它们在什么上下文中 int main() { int i = 50; foo(&i); cout << "\n\n" ; foo(i); getchar(); return 0; } void foo(int& bar) // & refer { cout << "refer

foo(参考整数x)和bar(参考整数y)

我写了一小段代码来显示内存位置和内存位置值,但我不完全理解它们的含义,以及它们在什么上下文中

int main()
{
    int i = 50;
    foo(&i);
    cout << "\n\n" ;
    foo(i);
    getchar();
    return 0;
}

void foo(int& bar) // & refer
{
    cout << "refer";
    cout << "\n&bar = " << &bar;
    cout << "\nbar = " << bar;
}

void foo(int* bar)// * pointer
{
    cout << "prefer";
    cout << "\n&bar = " << &bar;
    cout << "\nbar = " << bar;
}
在每种情况下,&和*意味着什么,以及它如何影响输出

当然,我已经在.h文件中添加了所有必要的方法

阅读部分答案后更新

int i(指针中的值,也称为直接指向变量)

  • 有一个值=50
  • 内存地址=0018FD04
指向int i的指针

  • 具有int i内存地址=0018FD04的值
  • 有自己的内存地址=0018FC30
因此,为了澄清,在示例中使用“reference”或“&bar”实际上创建了一个新变量,它复制了
foo(int&bar)
中传递的
int i

它将具有
inti
的内存地址,而不是包含50的新
&bar

TL;DR

  • foo(intbar)
    接收变量的“值”
  • foo(int*bar)
    接收变量的“值”,如果更改,它将更改调用方法中的变量
  • foo(int&bar)
    接收变量的指针/内存地址
我希望其他人也像我一样觉得这很有用,谢谢大家

指针来自C#,可以被认为类似于类,而值的行为更类似于结构-当您更改其成员时,您要么更改副本(对于未显示的传递值对象),要么更改已传递的相同对象(对于传递指针),或者更改相同的值,包括对已传递的实际值的引用(在按引用传递的情况下)。换句话说,不是对象的声明控制它的传递方式,而是实现决定它的传递方式

对于每个方法头,行为如下所示:

void foo(int& bar) // & refer
当您使用
type&name
传递时,您是通过引用传递的,并且您传递的是C#的等效值
ref
(或者
out
,如果您没有给变量一个有意义的开始值)。即使您已经传递了一个值,对该值的更改(包括更改该值本身)也将反映在调用范围中

void foo(int* bar)// * pointer
当您使用
type*name
传递对象时,您传递的是指向该对象的指针。但是,您正在将指针作为值传递,因此虽然您可以更改成员(在
int
的情况下没有意义),但不能更改值(
bar
)本身。与C#一样,这就像传递一个
对象而不使用
ref
/
out
——重新分配不会反映在调用范围中

void foo(int* bar)// * pointer
检查代码中
&
的用法

cout << "\n&bar = " << &bar;
cout想象一下我们有:

int* a; // This holds memory addresses
a = new int;

cout << a; // This will print the memory address of your new int
cout << *a; // This will print the value at the memory address a is holding 
cout << &a; // This will print the memory address of the pointer variable.
int*a;//它保存内存地址
a=新整数;

cout好的,首先是指针:

void foo(int* bar)// * pointer
{
    cout << "prefer";
    cout << "\n&bar = " << &bar;
    cout << "\nbar = " << bar;
}
在此上下文中,
*条
将为
50
(获取int指针指向的值)。
&bar
是所创建指针的地址(当然,指针本身也需要内存中的一个位置)。
bar
是指针指向的对象的地址(
i

参考案例:

void foo(int& bar) // & refer
{
    cout << "refer";
    cout << "\n&bar = " << &bar;
    cout << "\nbar = " << bar;
}
void foo(int&bar)//&参考
{
库特
我正在通过C++书籍/指南工作,但是指针和引用对我来说似乎有些模糊。
如果你尝试搜索,你会发现,但这是我的尝试

A是一个变量,通过指向它来告诉您在何处查找另一个变量。指针实际上只是一个与另一个变量内存中的地址相对应的数字。地址的示例是输出中的0018FC30和0018FD04

A是变量的别名(另一个名称)。如果您有一个变量
A
,并且创建了对该变量的引用
b
b
将成为
A
的替代名称。 引用的值不像指针那样是地址,而是引用的任何内容的值。 引用的有趣之处在于,当您复制或传递它们时,您没有复制实际值(这可能很昂贵),您只是复制名称

可观察到的主要区别是,您可以更改指针指向的内容(通过更改指针的值,因为它的值实际上只是一个地址),但您不能更改引用的内容(在某种程度上,它变成了引用的内容)

在每种情况下,&和*意味着什么,以及它如何影响输出

当您有一个变量
a
时,表达式
&a
的意思是“取
a
的地址”。 这很有趣,因为如果你有一个变量的地址,你可以让一个指针指向它

*a
或多或少可以被看作是逆运算,如果你有一个指针
a
*a
意味着“取这个指针指向的地址的值”


在任何有地址的地址上都可以使用<代码>和“<代码>”。甚至可以使用指针的地址来创建指针的指针!但是,只能在行为像指针的情况下使用<代码> >代码>,否则它将毫无意义。C++中的

< p>默认是逐值的。因此,如果你有一个<代码> f(x x)
然后编译器将在每次调用函数时生成复制类X的代码。如果X很大(如数组、字符串、映射等),出于性能原因,您可能不需要复制。复制还意味着如果修改参数
void foo(int& bar) // & refer
{
    cout << "refer";
    cout << "\n&bar = " << &bar;
    cout << "\nbar = " << bar;
}