一,指针定义及使用
普通指针:
int val=0;
int *p=&val;
*p=10;//可以通过指针改val的值
数组指针:
//使用
int arr[3];
int (*p) [3]=&arr;//arr整体
//重命名
typedef int (*p1) [3] ;//将p重命名为p1
//定义数组指针
int (*p) [3]=&arr;
p1 q=&arr;
函数指针:
//函数名含义:函数入口的地址
int add(int a,int b);
int mul(int a,int b);
int (*p) (int,int)=add;//函数指针定义
int (*p) (int,int)=mul;
add(1,2);//函数名调用
p(1,2);//函数指针调用
p=mul;
p(1,2);//调用mul函数
函数指针重命名:
typedef int (*p1) (int,int);//将上面的函数指针p重命名为p1
p1 q=add;
q(1,2);//调用add;
q=mul;
q(1,2);//调用mul
二、判断大小端问题
定义:
小端:低地址存放低位数据 低低 (vs存储模式)
大端:低地址存放高位数据 低高
//指针验证
int val=0x12345678;
char *p=(char*)val;
if(*p==0x12)
printf("大端");
else
printf("小端");
//联合体验证
union A
{
int val;
char arr[2];
};
int main()
{
A a;
a.value=0x12345678;
if(a.arr[0]==0x78)
printf("小端");
else
printf("大端");
}
内存中的地址解析:
0x78 0x56 0x34 0x12
低地址 高地址
三,指针加一能力(指针偏移量问题)
所指数据类型 * p;
p+1:所指数据类型的大小
//数组指针
int arr[3];
int (*p) [3]=&arr;
p+1 偏移3*4=12个字节
//指针数组
int *p=arr;
p+1 偏移4个字节
数组与指针的关系:
*(arr+0)=arr[0];
*(arr+1)=arr[1];
*(*(arr+1)+2)=arr[1][2];//二维数组
指针相减:
只能在连续内存空间中相减
四,指针数组
//定义
字符串常量
const char* arr[3]={"zs","jbjhchs","jhcs"};
五,const与指针结合
1.& *之间的关系
int val;
*(&val)=val;
2.const限定*p
不能改值但可以改地址
char val = 'k';
const char* p = &val;//const限定*p,*p为常性,所以*p不能被改,不能通过p修改p所指之物
//*p = 10;//err
3.const限定p
可以通过指针改值,但不能改地址
int a = 10;
int* const p = &a;//const限定p,p为常性,p不能被改,但可以用*p改a
//p=&b;//err
//*p=20//right 将a的值改为20
4.两个const进行限定
值和地址都不能被改
const int* const p = &a;
//p=&b//err;
//*p=20//err