【C语言】指针基础-指针类型的区别

本文章将会介绍指针,及在细节上的描述。

指针类型的区别在后半部分

一、什么是指针

       指针也就是内存地址,指针变量是用来存放内存地址的变量,在同一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。如下:

猜你喜欢

转载自blog.csdn.net/peng_lv/article/details/127933170