今天,顶针为大家带来c语言中非常重要的一部分————指针
一.C语言中的指针
内存是电脑上重要的存储器,计算机中所有程序运行时所需的数据都在内存中存储。所以为了有效的使用内存,就把内存划分成一个个小的存储单元,每个存储单元的大小为1个字节。
为了能够有效的访问到内存中的存储单元,就给每个存储单元进行了编号,这些编号称为存储单元的地址。
指针也就是内存地址,指针变量是用来存放内存地址的变量。在 C 语言中,允许用指针变量来存放指针,因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。指针就是变量,用来存放地址的变量(存放在指针中的值都被当成地址处理)
指针变量的大小:
在32位的机器上,地址是32个0或1组成的二进制序列,那地址就得用4个字节的空间来存储,所以一个指针变量的大小是4个字节。
在64位的机器上,地址是64个0或1组成的二进制序列,那地址就得用8个字节的空间来存储,所以一个指针变量的大小是8个字节。
二.指针类型:
无论是什么类型的指针,在
32
位平台上都是4
个字节,在
64
位平台上都是
8
个字节,那既然大小是固定的,还有分指针类型的必要嘛?准确 的说:有的。
char在内存空间中占1个字节大小,通过char*可以改变一个字节内容,int在内存空间中占4个字节,通过int*可以改变4个字节内容,所以由此可见虽然指针在32/64环境下的字节大小是一样的,但指针类型还是有意义的。
指针类型并不决定指针所占内存的大小,指针类型决定了 指针被解引用时访问几个字节。
i nt*的指针被解引用时访问4个字节,char*的指针被解引用时访问1个字节。
指针类型并不决定指针所占内存的大小,指针类型决定了 指针被解引用时访问几个字节。
i nt*的指针被解引用时访问4个字节,char*的指针被解引用时访问1个字节。
观察上图打印结果,p(int*)的地址为3050,而p+1的地址为3054,指针+1跳过了4个字节,pc(char*)的地址为3050,而pc+1的地址为3051,指针+1跳过了一个字节,这是为什么呢,同样是指针,+1却跳过的字节数不同,可以发现指针的类型决定了它+1跳过多少个字节,即决定了指针的步长。
char*
解引用时访问
一个字节
,
+1
时是也只能跳过一个字节,向后访问一个字节。
而
int*
解引用时访问
4个字节
,
+1
时就相当于跳过
4
个字节,向后访问
4
个字节。
总结:
综上所述,指针类型是有意义的,指针类型并没有决定指针变量所占内存空间大小,而是
(
1
)
指针类型决定了指针在被解引用时访问内存空间几个字节
(
2
)
指针类型决定了指针的步长,+1-1向后向前访问几个字节,即跳过几个字节
三.大小端的介绍:
大端(存储)模式:
是指数据的低位保存在内存的
高地址
中,而数据的高位,保存中内存的低地址中
小端(存储)模式:
是指数据的低位保存在内存的低地址中,而数据的高位,保存中内存的高地址中
请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序:
设一个
int
型数据用
16
进制表示为
0x11 22 33 44
(从低位到高位排列为
44 33 22 11
),内存
地址从左到右依次增加,则大端存储模式为:
11 22 33 44
,小端存储模式为:
44 33 22 11
。
//返回1则是小端存储,返回0则是大端存储
intcheck_sys()
{
inta=1;
//通过强制转换获得int型数据的第一个字节的值,char*指针类型在解引用时只会获取1个字节的值
return*((char*)&a); //解引用后值为一个char型,被强制转换成int型
}
int main()
{
int ret = check_sys();
if (ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}