0

我很困惑为什么这段代码有效。我被告知指针是一个“胶囊”,其中包含某物的地址。因此,该swapnum函数应该期待这些“胶囊”之一,而不是 int 的实际地址。它是否创建了一个临时指针并将其设置为该地址?如果是这种情况,那么如果我通过引用传递一个指针会发生什么int * c = &a; swapnum (&c...

#include <stdio.h>

void swapnum(int *i, int *j) {
  int temp = *i;
  *i = *j;
  *j = temp;
}

int main(void) {
  int a = 10;
  int b = 20;

  swapnum(&a, &b);
  printf("A is %d and B is %d\n", a, b);
  return 0;
}
4

6 回答 6

3

pointer只是地址的另一个词。它并没有什么神奇之处,它只是一个包含一个数字的变量,这个数字是它所指向的东西的内存地址。

在您的示例中,内存可能如下所示:

0x00001004 - 10         # a
0x00001008 - 20         # b
0x0000100C - 0x0001004  # i
0x00001010 - 0x0001008  # j
0x00001014 - 00         # temp

i并且j都是,int*这意味着它们包含一个包含整数的地址。代码*i说“返回地址中的任何值i并假设它是一个int.

因此,如果您查看您swapnum的 ,会发生以下情况:

int temp = *i;
# take the value at 0x0001004 (10) and place it in 0x00001014

*i = *j;
# place the value at 0x0001008 (20) and place it in 0x00001004

*j = temp;
# place the value at 0x0001014 (10) and place it in 0x0001008

之后的内存如下所示:

0x00001004 - 20         # a
0x00001008 - 10         # b
0x0000100C - 0x0001004  # i
0x00001010 - 0x0001008  # j
0x00001014 - 10         # temp

你当然可以这样做:

int* c = &a;
swapnum(c, &b);

您所做的就是获取 的地址a,将其放入c,然后将其传递给swapnum,它需要一个地址。指针只是一个地址。

于 2012-10-13T22:09:42.390 回答
2

对象的地址是指向对象指针!实际上,这就是指针的全部内容:它们现在位于对象所在的地址。使用地址而不是对象的全部意义在于使用地址您拥有相同的对象。

于 2012-10-13T22:02:23.867 回答
1

&item返回指向 的指针item

此外,在我所知道的所有现代架构中,指针只是项目的地址。

如果您创建一个指向指针的指针并将其传递给 swapnum,则会发生以下两种情况之一:

  1. 您的编译器会抱怨,因为指针的类型是 int* ,而不是 int
  2. 您将交换指针的值。至少如果指针与整数大小相同
于 2012-10-13T22:00:30.400 回答
1

main您使用address-of &运算符传递到andswapnum的地址时。ab

指针的值实际上一个地址。根本没有“胶囊”!(也许,更容易将它们视为没有胶囊的普通地址!)。

如果你这样做了int *c = &a,你可以将 c 传递给swapnum()而不是,&a它会工作得很好。你不能通过&c,因为你会传递一个int **,而函数期待一个int *.

于 2012-10-13T22:07:20.930 回答
1

&a是一个表达式,它被评估为a's内存中的地址。该值必须存储在指针类型的变量中。例如:

int* i = &a;

这里,i是一个类型的变量,int pointer它充当分配给它的值的容器,胶囊。然而,这个胶囊本身并没有保留a价值。它保持&a价值。此外,作为一个胶囊,通常是作为一个变量的直接结果。不一定是因为是pointer类型的变量。

现在,这个声明:

swapnum(&a, &b);

将参数处理为一些局部变量是一项非常正常的工作 - 一个正常的按值传递函数调用。在这种情况下,实际发生的事情是将&a值(即a's地址)复制到一个局部变量i中,这当然需要定义为 type int pointer

如果您定义:

int * c = &a; 

然后调用:

swapnum (&c...

那是行不通的,因为c它是一个类型的变量int pointer&c, 那么, 将是这样一个变量的地址; 因此,应该将包含该地址的局部变量类型i定义为此类值的容器;即它应该被定义为指向int pointer或的地址的指针类型的变量int **

这样的函数调用没有相应地改变函数肯定会导致编译时错误。

于 2012-10-13T22:19:57.710 回答
0

C++ 是一种静态类型语言。这意味着每个表达式都有一种特定类型的已知编译时间。C++ 标准告诉我们,如果表达式 expr 是内置类型 T,那么表达式 &expr 是类型 T*(指向 T 的指针)。就这样...

于 2012-10-13T22:06:29.220 回答