C ++指针和参考文献澄清

时间:2010-11-16 02:37:37

标签: c++ pointers

这基本上只是为了帮助我更好地理解指针,所以如果你们可以确认/否认/解释任何看起来我不理解的东西,我会非常感激。使用邮箱,阿姨和街道以及所有垃圾的例子让人感到困惑。

int a = 5;

int b = &a; // b will be the memory address of 'a'

int *c = a; // c will be the value of 'a' which is 5

int *d = &a; // d will be a pointer to the memory address of 'a'

int &e = a; // what would this be?


void FunctionA()
{
     int a = 20;
     FunctionB(&a);
     // a is now 15?
}

void FunctionB(int *a)
{
     a = 15;
}

谢谢你们的任何帮助,我只是想提高我的理解,超越我阅读的所有蹩脚的隐喻解释。

6 个答案:

答案 0 :(得分:3)

我会一个接一个地拿东西:

int b = &a; // b will be the memory address of 'a'

没有。编译器(可能)不允许这样做。您已将b定义为int,但&aint的地址,因此初始化无效。

int *c = a;

不 - 同样的问题,但相反。您已将c定义为指向int的指针,但您尝试使用int的对其进行初始化。

int *d = &a;

是的 - 您已将d定义为指向int的指针,并且您正在为其分配int的地址 - 这很好。 int(或int s)数组的地址是指向int的指针。

int &e = a;

这将e定义为对int的引用,并将其初始化为对a的引用。这是完全合法的,但可能不是很有用。仅供参考,参考的最常见用途是作为函数参数(当然,还有其他目的)。

void FunctionA() { int a = 20; FunctionB(&a); }
void FunctionB(int *a) { a = 15; }

要使其工作,您需要更改FunctionB中的分配:

void FunctionB(int *a) { *a = 15; }

实际上,您试图将int分配给指针,这将无效。您需要将int分配给指针指向 int以更改调用函数中的值。

答案 1 :(得分:1)

int &e = a; // what would this be?

e是对a的引用。在这种情况下,&符号不是'地址'运算符。您将e视为普通(非指针)变量,但ea的值无论您做什么都会相同(只要两者都保留在范围内)因为e本质上只是一个别名。

答案 2 :(得分:1)

  

int a = 5;

到目前为止一切顺利。

  

int b =& a; // b将是'a'

的内存地址

这实际上是一个编译错误。你可能意味着int *b=&a;b是整数的指针。 编辑:如果您想以数字形式获取地址,则需要强制转换为整数:int b=(int)&a;

  

int * c = a; // c将是'a'的值,即5

这个更令人困惑。确切地说,指针只是一个数字,但是这种类型的分配本质上是不安全的(正如你所看到的,你将5分配给指针,并尝试取消引用,这很可能会使程序崩溃)。如果你真的希望c指向内存位置5,你必须明确告诉编译器你知道你在做什么:int *c=(int *)a

  

int * d =& a; // d将是指向'a'

的内存地址的指针

这个是正确的,与第二个可能的意思相同。

  

int& e = a; //这会是什么?

ea的“参考”。基本上在内部它只是一个指向a的指针,但你不必手动取消引用它,编译器会为你处理它。

  

void FunctionA(){int a = 20; FunctionB(安培;一个); //现在是15岁? }

  

void FunctionB(int * a){a = 15; }

...假设您将其写为*a=15;。你正在覆盖a指向的VALUE,而不是指针本身。

你似乎对此总体上感到困惑,我建议你阅读“Thinking in C ++”这本书,它写得非常好!

答案 3 :(得分:1)

对于你的具体例子,你有很多好的答案,所以我想分享一下我用来学习指针在我开始时的工作原理的一般技巧。

拿一张大方格纸,纵向放在你面前的桌子上。这是你电脑的记忆。每个框表示一个字节。选择一行,并将数字“100”放在最左边的框下方。这是内存的“最低地址”。 (我选择100作为非0的任意数字,您可以选择另一个。)从左到右按升序对数字进行编号。

+---+---+---+---+---+--
|   |   |   |   |   | ...
+---+---+---+---+---+--
100  101 102 103 104  ...

现在,暂时假装一个int是一个字节大小。你是一台八位电脑。将您的int a写入其中一个框中。方框下面的数字是它的地址。现在选择另一个包含int *b = &a的框。 int *b也是存储在内存中的变量,它是一个包含&a的指针,发音为“a的地址”。

int  a = 5;
int *b = &a;
  a       b 
+---+---+---+---+---+--
| 5 |   |100|   |   | ...
+---+---+---+---+---+--
 100 101 102 103 104  ...

现在,您可以使用此模型直观地处理您看到的值和指针的任何其他组合。这是一种简化(因为正如语言学者所说,指针不是必然一个地址,内存不是必然顺序,并且有堆栈和堆和寄存器等等,但对于99%的计算机和微控制器来说,这是一个相当不错的类比。

你也可以扩展真正的四字节int的模型......

int a = 5;
char b = 2;
  a   a   a   a   b
+---+---+---+---+---+--
| 0 | 0 | 0 | 5 | 2 | ...
+---+---+---+---+---+--
 100 101 102 103 104  ...

答案 4 :(得分:0)

我认为你的意思是:

int *b = &a;,它产生一个名为b的指针,指向a的值(b是一个指针,它是a的地址)

int c = *b;,(或者只是int c = a,如果你只想要c有一个' s)在这种情况下,*取消引用指针b

FunctionA()如下所示,a将为15(您将a的地址传递给FunctionB)

void FunctionB(int *a) {*a = 15;}将值设置为15(*取消引用)

答案 5 :(得分:0)

int &e=a;是对“a”的引用。

这些都是错误:


int b = &a;
int *c = a;