一、指针修饰符
1、const常量化:只能读,不能被修改。
用法:const int a=10;//此时a不能再被直接修改。
但是,可以通过地址来对a进行修改,例如:
const int a=10;
int *p=&a;
*p=20;
此时,输出的a就成了20。
二、大小端
大端存储:在低地址存储高位数据,在高地址存储低位数据
小端存储:在高地址存储高位数据,在低地址存储低位数据
如何验证自己的计算机是大端存储还是小端存储?
解:
int a=0x12345678;
char b=a;
这里由于int 类型与char 类型字节大小不同,使得char 只能显示一个int 中的字节,所以可以由此判断,结果如下图:
三、二级指针
用来存储一级指针的地址。
格式:存储类型 数据类型 **指针变量
图解如下:
a的值10存在了地址0x100中;
指针变量p存储的是a的值10的地址,a的值10的地址的地址为0x200;
q存储的是p存储的a的值10的地址的地址,q存储的是p存储的是a的值10的地址的地址的地址为0x300。
四、数组指针
1、指针与一维数组
访问数组的元素a[i]的值:
直接:a[i] *(a+i)
间接:p[i] *(p+i)
访问数组的元素a[i]的地址:
直接:&a[i] a+i
间接:&p[i] p+i
2、指针与二维数组
访问a[i][j]的值:
直接:a[i][j] *(*(a+i)+j) *(a[i]+j)
间接:p[i][j] *(*(p+i)+j) *(p[i]+j)
访问a[i][j]的地址:
直接:&a[i][j] *(a+i)+j a[i]+j
间接:&p[i][j] *(p+i)+j p[i]+j
五、指针数组
本质上还是数组,但是存储的是指针变量。
1、存储普通变量地址
int a=10, b=20 ,c=30;
int *p[3]={&a,&b,&c};
访问:10 ---> p[0]----> *p[0] **p
30 : *p[2] *(*(p+2))
2、存储二维数组的每一行第一列的地址
int a[2][3]={1,2,3,4,5,6};
int *p[2]={a[0],a[1]};
访问:
地址:第一行第二个元素的地址:p[0]+1 *p+1
第一行第二个元素的地址:*(p[0]+1) *(*p+1)
第二行第三列地址:p[1]+2 *(p+1)+2
3、存储字符串
char *p[3]={"123","hello","hqyj"}
char str[32]
printf("%s",str)
打印 hello: p[1] *(p+1)//单独一个p为指针数组的第一个元素的地址,+1则是第二个元素
打印字符:*(p[0]+1) *(*p+1)