C语言指针整理
1、内存地址
内存是按照字节编址的,所以它的寻址单位是字节(Byte),而一个字节又有是由8位(bit)的0或1组成。
如果一台计算机的内存是4GB,也就是说它的内存总字节数有个,所以要想表示这台计算机的内存地址,就要用到32位(bit)。类似于这样的32位来表示一个内存地址:0110 1101 1100 0010 1101 1110 0101 1101,由于写起来不方便,所以我们将上述地址用其十六进制表示:0x6DC2DE5D。
所以这样的话4GB内存的寻址空间就从0x00000000到0xFFFFFFFF,总共有个。
2、指针变量
明白内存地址后,指针实际上就是内存地址,指针变量则是存储指针的变量,也即是存储了内存地址。下面对指针变量从下面几个方面进行分析。
指针变量的类型
定义一个int* p为例,这个指针变量的类型就是int *。
指针变量所指向的数据类型
p变量所指向的类型是int数据类型,编译器通过指针所指向的这片内存区域作来决定这片内存区域存放什么数据类型,因为int类型是4个字节的大小,所以从p指针变量指向的内存地址到后四字节这片内存区域就存放了一个int的数据类型。
借这个例子就可以很好理解c语言中malloc函数了。malloc函数作用是分配指定大小的连续内存空间,并返回这个内存空间的首地址,而这个地址指向的数据类型不明确,所以通常还需要对它进行强制转换,这样就得到了一个指向int类型数据的内存首地址。
void test(){
int* p = (int*)malloc(sizeof(int));
printf("%d", p);
}
指针变量的大小
通过上面的分析,指针变量的值就是它指向的内存地址,是一个数值类型,无论它指向什么数据类型,这个数值类型都是占据了4个字节,也就是说指针变量本身就占据了4个字节。
int main()
{
int* p;
printf("%d",sizeof(p)); // 输出4,p变量的大小是4字节
return 0;
}
3、地址运算符
*运算符称作指针运算符或者间接引用运算符,它的作用就是取一个指针变量所指向的内存区域所存储的数据值。
&运算符称作取地址符,它的作用就是取一个变量所在的内存地址。
void test(){
int a = 10;
printf("%x", &a); //60fefc
int b = *(&a);
printf("%d", b); //10
}
地址运算符应用时,通常结合指针变量。
void test(){
int a = 10;
int* p = &a;
printf("%d", *p); //10
}