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

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

 

  * ,中国翻译为“解引用”,初听很拗口,其实是很是贴切的翻译。若是将它翻译为取值,其实很差。布局

 咱们继续举例说明:spa

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指针,因此把左边的值,赋值给四个字节。

 

因此咱们能够看到,* 的意义,是解引用,再也不引用的意思,表明直接移动到被引用的内存上。 后续的具体意义依赖于具体环境。

 

嗯,本质上,* 符号就意思是,在位模式上去执行。

因此 刚才的赋值,就是位模式的拷贝。

 

咱们发现 只要 内存布局相同,就能够成功获得咱们想要的结果。

好比 类/结构体的拷贝。

相关文章
相关标签/搜索