前言
(1)
内存中最小的存储单位是存储单元,一般是8个二进制位(也就是一个字节)。存储单元可以存储数据和读写数据
(2)
内存中每一个存储单元都有一个编号,也就是“地址”。
(3)
定义一个变量:
int a = 3;
深度理解来讲,可以理解为,auto int a = 3;
这一句话就告诉了编译器,将a放在动态存储区,一共有四个字节(看具体编译器),变量名是a,其存放的值是3
然后,后面在使用的时候,可以通过a来使用该变量(其实是通过变量名找到存储单元的地址,从而对存储单元进行
存取操作的,即将变量名转换成变量的地址)
(4)
如上所说,a占了四个字节,那么相当于跨了四个存储单元,需要注意的是,这四个单元是连着的,由于已经告诉了
内存占四个字节,那么接下来的变量再分配的时候,是在这四个单元之后再分配。
指针
定义指针变量
类型名 * 指针变量名
int * pointer;
如上所示:定义了一个int 类型的 指针变量
给指针变量赋值
int a = 4 ;
pointer = &a;
如上所示:将定义的a变量的地址交给定义好的指针变量
关系
变量a 在使用时,编译器自动将a转换成变量的地址,但是也可以手动获得:
&a
通过这个可以得到这个变量的地址
通过pointer = &a 可以认为是指针变量pointer 指向了整型变量a
*pointer = 1 ;
发现可以将int类型值1交给*pointer,那么*pointer可以认为是变量a。
总结来讲:
& : 取地址运算符
‘*’:指针运算符(间接访问运算符)
指针变量存放的是变量的地址
int * pointer = &a;
* pointer 等价于 a
如图:
下面看个例子:
int main(){
int a,b;
int * pointer_a,* pointer_b;
pointer_a = &a;
pointer_b = &b;
printf("请输入两个数字");
scanf("%d,%d",&a,&b);
printf("您输入的值是:a=%d,b=%d",a,b);
printf("开始进行变换");
int tem;
tem = * pointer_a;
* pointer_a = * pointer_b;
* pointer_b = tem;
printf("你输入的值变成了:a=%d,b=%d",a,b);
return 0;
}
为啥需要基类型
发现指针变量都有基类型。
因为不同类型的数据在内存中所占的字节数和存放方式是不同的。如果想通过指针引用一个变量,只是通过一个地址不行。
它并不知道从一个还是两个字节中取出数据,所以基类型知道了才能按存储单元的长度和数据的存储形式正确的取出数据。
并且下面的指针的移动和指针的运算等运算都是需要基类型。
指针变量可以作为函数参数
既然指针变量是一种变量,那么就可以作为函数的参数,可以实现将一个变量的地址传送到另外一个函数中。
void swap (int * p,int * p2){ //省略了}