这一节再续写一篇。由于要足够多的例子才能说清楚*这个符号。函数
* ,中国翻译为“解引用”,初听很拗口,其实是很是贴切的翻译。若是将它翻译为取值,其实很差。布局
咱们继续举例说明: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指针,因此把左边的值,赋值给四个字节。
因此咱们能够看到,* 的意义,是解引用,再也不引用的意思,表明直接移动到被引用的内存上。 后续的具体意义依赖于具体环境。
嗯,本质上,* 符号就意思是,在位模式上去执行。
因此 刚才的赋值,就是位模式的拷贝。
咱们发现 只要 内存布局相同,就能够成功获得咱们想要的结果。
好比 类/结构体的拷贝。