1.内存和地址
我们知道电脑中的CPU在处理数据的时候需要在内存中读取数据处理后的数据也会放在内存中。把内存划分为一个个的内存单元每个单元的大小是一个字节。每个字节都有它对应的编号也就是它的地址,以便CPU可以快速的找到一个内存空间。C语言中我们把地址叫做指针,所以内存单元的编号==地址==指针。
2.指针变量和地址
取地址操作符(&):
C语言中,创建变量就是在向内存申请空间,下例在创建a变量的过程中就是向内存申请了四个字节的空间,那么这四个字节都有地址,取地址操作符&就可以把a的地址(四个地址的较小的一个)取出来,这样就可以知道其他三个地址了。
int a=10;
printf("%p\n",&a);
指针变量:
我们把a的地址用&取出来了,那么我们把&a放在哪呢?放在指针变量中。指针变量是一种用来存放地址的变量,放在指针变量中的值都会理解成地址。
int a = 10;
int* pa = &a;
如何理解指针类型:
pa的类型是int*,*是说明pa是一个指针变量,int说明pa指向的是一个int类型的对象。那么如果对象是char类型的,对应的指针变量的类型就是char*。
解引用操作符(*):
有了一个元素的地址,我们要使用他的时候就要用到解引用操作符*
int a = 10;
int* pa = &a;
printf("%d",*pa);
这里pa是一个地址,使用*pa系统就会寻找并读取这个地址中的数据。
指针变量的大小:
根据计算机的相关知识,我们可以知道32位机器上有32根地址总线,每根地址线只有两种输出0/1(低电平和高电平)那么一个地址就是32个bit位就是四个字节,所以在32环境下指针变量的大小是4个字节,同理64位环境下就是8个字节。
注意指针变量的⼤⼩和类型是⽆关的,只要指针类型的变量,在相同的平台下,⼤⼩都是相同的。
3.指针变量类型的意义
指针的解引用:
int*类型指针和char*类型指针的可操作空间不一样,我们可以观察一下下面的两段代码。
int main()
{
int n = 0x11223344;
int *pi = &n;
*pi = 0;
return 0;
}
/************************/
int main()
{
int n = 0x11223344;
char *pc = (char *)&n;
*pc = 0;
return 0;
}
第一段代码会将n的四个字节全部改为0,第二段代码只是将n的第一个字节改为0。
结论:指针的类型决定了,对指针解引⽤的时候有多⼤的权限(⼀次能操作⼏个字节)。