《斯坦福大学:编程范式》第三节3:* 与&的真正含义

  这一节再续写一篇。因为要足够多的例子才能说清楚*这个符号。

  * ,中国翻译为“解引用”,初听很拗口,实际上是非常贴切的翻译。如果将它翻译为取值,其实不好。

 我们继续举例说明:

void swap(int * ap, int* bp)
{
ap = bp;

}

int a = 5;
int b = 6;
swap(&a, &b);
printf("%d",a);

我们交换了 ap 跟bp的地址,打印出来,发现a的值并没有变,为什么? 因为 int * ap bp是新的swap函数的栈上的临时变量了,是一块新的栈上内存存储的。

a 和 b 的地址一直不变。 但是可以有很多指针指向a和b,也就是指向a和b的地址首位,但 这些指针的地址可以不同。

假如我们把  swap改为如下:

void swap(int * ap, int* bp)
{
  *ap =*bp;

}

会发现 a的值变为b的值了。

ap是一个指针,它有自己的内存空间。它通过指向了 存储着5的那个地址, "引用"了该段内存。

* 符号,则是在执行过程中,告诉编译器,解开这个引用,直接移动到被指向的地址,开始操作。 所以叫 解引用

它并不是直接取被指向地址的值。所以  为什么 解引用 是最准确的翻译。

所以, *bp,是移动到bp指针所指向的内存。

然后因为左边是 “=” 代表赋值,因为是int指针,所以去拿这个内存的四个字节。

然后右边,*ap,是移动到ap指针所指向的内存。

然后因为右边是 “=” 代表被赋值吗,因为是int指针,所以把左边的值,赋值给四个字节。

所以我们可以看到,* 的意义,是解引用,不再引用的意思,代表直接移动到被引用的内存上。 后续的具体意义依赖于具体环境。

猜你喜欢

转载自www.cnblogs.com/sundayofit/p/9221381.html