在开发中,发现忘记了很基础的内容。所以学习记录下
C语言中会遇到指针和变量之间赋值的情况,*和&以及组合。如果不知道符号的真实含义,就会很容易遗忘甚至出错。
其实只要记住4点:
- *表示取值符号
- &表示取址符号
- 变量保存值,指针指向地址。
以如下代码举例
int *i_point;
int i=3;
i_point=&i;
内存总的表现如图
i 是整形变量,保存值,C语言i表示3,也就是指向存着3内存块,所以i输出是3。
&i &表示取址,所以&i就是0x101
i_point 是指针变量,保存地址,C语言i_point表示赋值变量的地址0x201,也就是i的地址0x201
&i_point 表示i_point取地址,也就是0x301
*i_point 表示i_point取值, i_point是i的地址&i,a的地址取值即i,也就是3
*&i_poinrt 表示i_point取地址后再取值,也就是&i_point上的值,地址: 0x301上的值为0x201
&*i_point 表示i_point取值后再取地址,也就是* i_point(或a)的地址,也就是0x101
代码如下:
#include <stdio.h>
int main(){
// 变量,值,指针在初始化时候的意义
int i=3;
// 1.变量赋值 在内存中创建了一个地址0x101存放值3,然后再创建一个地址0x201存放0x101。
printf("整形变量的值:%d,整形变量的地址:%p\n",i,&i);
// 2.指针赋值 在内存中创建了一个地址0x301存放地址0x201。
int *i_point;
i_point=&i;
// 只要记住:*表示取值符号,&表示取址符号,变量保存值,指针保存地址。
// i 是整形变量,保存值,C语言i表示3,也就是指向存着3内存块,所以i输出是3。
printf("i 是整形变量,保存值,C语言i表示3,也就是指向存着3内存块,所以i输出是%d\n",i);
// &I &表示取址,所以&i就是0x101
printf("&表示取址,所以&i就是%p\n",&i);
// i_point 是指针变量,保存地址,C语言i_point表示赋值变量的地址0x201,也就是i的地址0x201
printf("i_point 是指针变量,保存地址,C语言i_point表示赋值变量的地址%p,也就是i的地址%p\n",i_point,&i);
// &i_point 表示i_point取地址,也就是0x301
printf("&i_point 表示i_point取地址,也就是%p\n",&i_point);
// *i_point 表示i_point取值,i_point是i的地址&i,a的地址取值即i,也就是3
printf("*i_point 表示i_point取值,i_point是i的地址&i,&i取值即i,也就是%d\n",*i_point);
// *&i_poinrt 表示i_point取地址后再取值,也就是&i_point上的值,地址: 0x301上的值为0x201
printf("*&i_poinrt 表示i_point取地址后再取值,也就是&i_point上的值,地址: %p上的值为%p\n",&i_point,*&i_point);
// &*i_poinrt表示i_point取值后再取地址,也就是* i_point的地址,值的地址,也就是0x101
printf("&* i_poinrt表示i_point取值后再取地址,也就是* i_point(或a)的地址,也就是%p\n",&*i_point);
return 0;
}