一、什么是指针变量?
指针变量,实质上是一个变量,只是它是存放地址的变量,指针的类型代表的是它所指向的变量的类型,因此就有了指向整形、字符型、浮点型等其他类型的指针。
但实际上所有类型的指针变量存放的都是int型的地址(16位的编译系统,int是2字节; 32的编译系统,int是4字节)。
本质上,不同类型的指针变量并没有区别(因为指针变量的类型为int型,因此指针变量只能存放地址),注意要与指针所指向的对象类型区分开来,
指针变量所存储的地址为指针所指向的对象的首地址。
指针也是一个变量,它自己占据一个4个字节的地址空间(由于程序的寻址空间是2^32次方,即4GB,
所以用4个字节表示指针就已经能指向任何程序能够寻址到的空间了,所以指针的大小为4字节)
#include <stdio.h>
int main(void)
{
int * pint;
char * pchr;
float * pflt;
int a = 2;
char b = 3;
float c = 3.5;
pint = &a;
pchr = &b;
pflt = &c;
printf("pint = 0x%p/n",pint);
printf("pchr = 0x%p/n",pchr);
printf("pflt = 0x%p/n",pflt);
return 0 ;
}
输出结果:
pint = 0x0012FF3C
pchr = 0x0012FF33
pflt = 0x0012FF24
二、不同类型的指针变量有什么区别?
不同类型的指针变量指向不同类型的对象,这些指针变量结合指针运算符(*)就等价于指向的对象的值,
但我们又知道所有的指针变量的类型都是一样的(都是int型)。
到底声明不同类型的指针变量的背后是什么?
其实声明不同类型的指针变量既是规定了该变量结合指针运算符时读取内存中的字节数,
同样在指针移动和指针的运算时(加、减)在内存中移动的最小字节数。
三、指针的强制类型转换
1、举例说明
上图对应函数调用为int printf(const char *fmt, ...),fmt为char *指针类型,所以共占了32位字节,但是*fmt执行的是一个字节,*fmt++执行的是下一个字节,&fmt得到一个32位地址,(char *)&fmt得到是一个执行字节的指针,(char *)&fmt+4后正好执行了var3,因为fmt占用4个字节。(int *)((char *)&fmt+4),又将其转换为执行4个字节的指针,此时*((int *)((char *)&fmt+4)),那么取出来的数字变是32位的数据,也就是var3。
总结:强制转换为char *,那么指针++后移动一个字节,*指针得到一个字节。强制转换为int *,那么指针++后移动4个字节。同时*指针得到4个字节。
无论什么类型的指针变量,相减后得到的都是相差的个数。
2、什么时候需要强制类型转换
- #include <stdio.h>
- #include <stdlib.h>
- int main()
- {
- int a =6336;
- char *b = (char *)&a;
- printf("%d",*b);
- getchar();
- return 0;
- }
此时得到的结果为-64,因为*b只指向一个字节。
后记:关于指针几个知识点,综合网上资料,后续还有指针的内容,待续。。。