指针及指针类型
char *pc = NULL;
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;
char* 类型的指针是为了存放 char 类型变量的地址。
short* 类型的指针是为了存放 short 类型变量的地址。
int* 类型的指针是为了存放 int 类型变量的地址。
我们知道在同一平台上,不同类型的指针大小其实是一样的,那为什么还要给指针分类型呢,或者说:指针类型的意义是什么?
我们来看这样一段代码
#include <stdio.h>
int main()
{
int n = 10;
char *pc = (char*)&n;
int *pi = &n;
printf("%p\n", &n);
printf("%p\n", pc);
printf("%p\n", pc+1);
printf("%p\n", pi);
printf("%p\n", pi+1);
return 0;
}
结果是这样的
为啥是这样的结果呢?pc和pi都是指针变量,也都加的是1,为什么结果就不同了呢?
其实我们很容易就能分析出原因:
指针变量pc和指针变量pi的唯一区别就是两者的类型不同,pc是char类型的指针变量,存放的是字符变量(大小为1个字节)的地址;
而pi是int类型的指针变量,存放的是整型变量(大小为4个字节)的地址,
而结果pc和pc+1的差值恰好就是1;pi和pi+1的差值恰好就是4
所以我就可以得出指针类型的第一个意义就是:
指针的类型决定了指针向前或者向后走一步距离有多大。
char类型的指针+1就向后走1个字节
int类型的指针+1就向后走4个字节
double类型的指针+1就向后走8个字节
…以此类推 减也是同样的道理
函数指针:(本质是一个指针,指向一个函数的指针)
指针函数:(本质是一个函数,函数的返回值是一个指针)
这个和数组指针,指针数组同理,我们只要看它后俩个字就能了解它的本质,从而更好的去应用它。
指针和变量的关系
在程序中我们可以通过指针变量来引用变量
int a = 10;
int *p;
p = &a;
*p = 100;
printf("%d\n",a);
printf("%d\n",*p);
printf("%p\n",&a);
printf("%p\n",p);
如上所示,我们可以通过操作指针变量来给变量赋值,也可以进行运算等。
字节序
字节序,顾名思义,就是字节组织的顺序。我们可以将其根据其存储时从低位开始还是从高位开始分为两种,具体如下:
类型 简写 本质
大端 BE(big endian) 将高序字节存储在起始地址
小端 LE(little endian) 将低序字节存储在起始地址
这就是大小端序的含义,两者除了顺序上没有其他的区别,在性能上、功能上都是一样的。