本文章将会介绍指针,及在细节上的描述。
指针类型的区别在后半部分
一、什么是指针
指针也就是内存地址,指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的(如在X86环境下,指针变量的大小都是4个字节),而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。
二、如何操作指针
2.1、指针的创建
指针变量的声明式在C的数据类型的基础上加上“*”号,这样就是告诉编译器这个变量是一个指针变量,操作如下图所示:
int main()
{
int a = 0;
int* b;
return 0;
}
以上代码声明了一个整型变量a,并创建了一个整型指针b。
2.2、指针的使用
指针变量是用来存储地址的,指针中存储的地址,这就需要提到取地址符——&,使用&会得到变量的地址,操作如下:
int main()
{
int a = 0;
int* b;
b = &a;
return 0;
}
b=&a,该操作将a的地址存储在b中,此时a的地址为001df914,b=&a操作后,b中存储的就是001df914,如下图所示:
此时b中存储的是a的地址,这样就可以通过操作b中存储的地址来操作变量a,如何来通过b来操作a呢?这是需要使用到解引用符号“*”,*指针变量可以直接访问指向指针变量中存储的地址的数据,通过使用*就可以对指针变量进行解引用操作来操作变量a,等效的讲*b和a是一样的。如下图所示:
2.3、指针类型的区别
在32位环境中,指针变量都是四个字节;在64位环境中,指针变量都是八个字节。
虽然在同一个环境中指针变量的大小是相同的,但是不同指针类型的性质是有很大的差异的,
差别:
1>不同类型的指针解引用空间大小不同
整型指针解引用操作4个字节
字符类型指针解引用操作1各字节
示例如下:
int main()
{
int* a;
char* b;
int num = 0x12345678;
a = #
b = a;
*b = 0;
printf("%x", *a);
return 0;
}
最后输出的结果是1200(十六进制)
这是因为num=12345600(16进制)转化为二进制
num=0001 0010 0011 0100 0101 0110 0111 1000(二进制)
一个16进制用4个二进制表示,就是说一个16进制需要4bit大小
将num的地址给a,此时指向如下图所示:
num地址的最低位是0x008ff734
a指向num地址的最低位,此时a中存的就是0x008ff734,然后再将a中存的地址给b,此时b中存的也是0x008ff734,然后将b进行解引用,并赋值为0,由于b是字符型指针,只会对一个字节进行操作,7和8是十六进制数,所以7和8在一个字节中,此时*b=0,会将7和8覆盖为0,如下图所示:
所以最后会输出1234500
2>不同类型的指针进行+1操作后得到的地址是不同的
如:整型指针进行+1操作后,指针中的地址会增大4个字节;字符指针进行+1操作后,指针中的地址会增大1个字节。
示例如下:
int main()
{
int* a;
char* b;
int num = 0x12345678;
a = #
b = a;
a = a + 1;
b = b + 1;
printf("num地址: %x\n", &num);
printf("a: %x\n", a);
printf("b: %x\n", b);
return 0;
}
如果num的地址为0x0113f8e4
则输出结果为:
a:0x0113f8e8
b:0x0113f8e5
原因如下:
在a=a+1和b=b+1前,a和b中都是存储的是0x0113f8e4,即a和b都是指向在同一个空间,当a=a+1和b=b+1操作后,由于a是整型指针,b是字符指针,所以a=a+1后a中的地址为0113f8e8,b=b+1后b中存的地址为0113f8e4。如下: