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

Posted sundayofit

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《斯坦福大学:编程范式》第三节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指针,所以把左边的值,赋值给四个字节。

 

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

 

以上是关于《斯坦福大学:编程范式》第三节3:* 与&的真正含义的主要内容,如果未能解决你的问题,请参考以下文章

斯坦福大学数据可视化课程学习笔记:第三节 视觉设计

斯坦福大学数据可视化课程学习笔记:第三节 视觉设计

斯坦福大学数据可视化课程学习笔记:第三节 视觉设计

《编程导论(Java)·1.4.1 范式》

(王道408考研操作系统)第二章进程管理-第三节7:经典同步问题之多生产者与多消费者问题

第三节 p标签