1 指针(初阶)
概念: 指针是一个对象,它存着一个地址,在这个地址中存该指针的值
eg: 门牌号 001 小吕家
32位操作系统 32条地址总线,可以查找 2^32的寻址范围
2^32/1024/1024=4G 指针占4字节(32位操作系统4字节,64位下8字节)
不同类型的指针可以接收不同类型的地址
char* pc=&ch;
int*pa -=&int
void* (1)可以接受不同类型的指针,但不能进行解引用
(2)不能进行指针运算(因为它是无类型的,没办法确定返回的长度)
不同 *类型加整数后的地址取决于原来的类型;
eg short * p=&sh
p+2 地址100
p+2的地址为104
<1>野指针(没有指向)
eg int* p
他没有地址,运行时会报错;
非要初始化时 初始化为 (空指针) int* p=NULL;
(NULL相当于0地址,该地址拒绝访问,被保护),所以不能解引用,不然会崩溃;
<2>(什么类型指针解引用之后对应相应字节) ———>大小端(低地址对应低重权(低数据)——>小端,相反大端)
一般手机是小端,电脑是大端
如何判断操作系统大小端?
int n =0x12345678;
char* pc=(char *)&n
printf("%x",*pc);(解引用1个字节,一个字节可以存两个位,);
结果为
如果输出是78就是小端,输出12就是大端;
<3>指针和数组名
1: 数组名代表数组首元素地址
2; sizeof(数组名)代表整个数组字节大小
3: P[i]=*(p+i)即数组的 [ ] 跟解引用等价
4:指针减指针所得他们的距离(只有在两个指针同时作用在同一块内存时才有意义)
eg;int a[]={1,2,3,4,5,6,7,8,9,0}
int* p=&a[4];
int* p1=&a[2];
p-p1=2;(得距离)
*vp++ = 0; 等价于 *vp=0; vp++;
<4> 允许指针跟数组最末元素得后一个比较,但不允许跟首元素前一个比较
eg: int a[3];
int *p;
for(p=0;*p<a[4],p++)允许
<5>指针数组
指针数组就是数组,只不过内存放的为地址
int a[3]={0} 类比 int* b[3]={"hello","world","C"}
int* c={arr1,arr2,arr3}(其中arr1,arr2,arr3均为数组)