1、什么是指针
1.1指针
我们将内存中字节的编号称为指针,每个编号是唯一的,根据编号可以找到对应的地址,所以提到指针,将其通俗理解为地址。
1.2:指针大小
地址从0开始增加,X32系统下指针大小为4字节,X64系统下,指针大小为8字节
1.3指针定义
(1)普通指针
char * p = &a; //定义一个char类型的指针P,指向a的地址
注意:在指针定义中,*是和变量名结合
(2)数组指针
本质是指针,但是指针所指的对象是数组
int arr[2]; //定义一个int型的数组arr,数组大小为2
int (*p)[3]=&arr; //定义指针p,它所指对象为数组arr,故p为数组指针
(3)函数指针
本质是指针,所指对象是函数
int Add(int a,int b) //实现了一个Add函数
int(*p)(int,int)=Add; //定义函数指针
int (*q)(int,int)=Mul;/ /定义函数指针
Add(1,2); //正常调用函数
p(1,2); //通过指针来调用Add函数
Mul(1,2); //正常调用函数
q(1,2); //通过指针来调用Mul函数
1.4指针的使用
( 1)普通指针:
int val=0;
int*p=&val;
*p=1;(解引用)
(2)数组指针:
int arr[3]={1,2,3};
int(*p)arr[3]=&arr;
p是指向arr[3]的指针,其指针加1的偏移量为12个字节。
eg:分析*((int*)(p+1)-1)的访问值
分析:p+1为数组结尾的地址,(int*)(p+1)将该指针强转为指向int*的指针,使指针偏移量发生改变,由12个字节转变为4个字节,则(int*)(p+1)-1的地址为[2]结尾的地址,故*((int*)(p+1)-1)的访问值为3。
2.数据存储模式
分为大端存储和小端存储
小端存储是将数据的低位存储在内存的低地址处,高位存储在内存的改地址处;大端是将低位存储在内存的高地址处,高位存储在内存的低地址处
验证方式
int main()
{
short val = 0x1234;
char* p = (char*)&val;
if(*p == 0x34)
{
printf("小端");
}
else
printf("大端");
3.指针+1能力
对于指针p ;p+1 指针在进行加法操作时,会根据指针所指向的数据类型而移动相应的字节数。实质上就是再说p的偏移量。例如,如果一个指针指向一个整型变量,p+1后指向的地址由原来变量的地址向高地址方向增加了4个字节。
4.const与指针结合
加以const后,其值不可以改变,有了常量的属性
如:
int * const p =&a; 限制指针本身, 指针变量本身的值不能被修改
const int *p = NULL; int const *p = NULL; 限制指针变量指向的数据
const int * const p = &a; 限制指针变量和指针变量指向的数据的值