《斯坦福大学:编程范式》第三节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:* 与&的真正含义的主要内容,如果未能解决你的问题,请参考以下文章