指针
a.指针==地址
b.获得任何变量的地址都是:(取地址符)&变量名
c. * 指针变量名,则间接访问到指针指向的变量
d.同类型赋值
运算
1. 指针+数字 //需要调整,调整的权重(格子大小)为sizeof(
指针去掉*号,相当于解引用)
比如:*int 调整完后的sizeof为4,**double调整完后的sizeof为4(因为所有指针的大小为4个,去掉一个*号的二级指针仍为一级指针)
(1)加一个单元格 : p++(一个单元格是几个字节取决于指针的类型,比如通常来说在32位平台下,int是4个字节,float 是4个字节,double是8个字节)
#include //加一个单元格 就把原来的a[0]的1.和a[1]的2分别替换成10和20了
int main()
{
int arr[]={1,2,3,4};
int *p = arr;
*p = 10;
p++;
*p = 20;
printf("%d,%d\n",arr[0],arr[1]);
}
(2)加一个字节 :p=(int *)((int)p+1) 但是通常不用,因为毕竟麻烦
2.指针 - 数字 //运算同加法一样
3.指针 - 指针 //间隔的是单元格数,不是字节数,例子为强制转换的第一个
方法:1.算出字节数
2.除以调整的权重
总结:指针的所有运算都要调整,调整的权重为sizeof(指针去掉一个*号)
强制转换:
1.10进制的减(加)法输出。下面的例子以减法为例
#include
int main()
{
int arr[]={0,1,2,3,4,5,6,7,8,9};
int *q = &arr[1];
int *p= &arr[9];
printf("%d\n",p-q); //没有转化类型直接算9-1=8
printf("%d\n",q-p); //同上 1-9= -8
printf("%d\n",(short*)p-(short*)q); //int字节数为4,一共4*8=32个字节数,除以调整的指针short的权重为2,最终为16
printf("%d\n",(double*)p-(double*)q); //同理除以double的权重为8,最终为4
printf("%d\n",(int***)p-(int***)q); //int***去掉一个*号后,为二级指针,权重为4,最终为8
printf("%d\n",(char**)p-(char**)q); //char**去掉一个*号后,为一级指针,权重为4,最终为8
printf("%d\n",(long)p-(long)q); //long不是指针无法解引用去掉一个*号。相差仍为32个字节数
}
2.16进制的减法输出
#include
int main()
{
int *p = (int *) 0x2010; // 向前借一位是16
printf("%x\n",p-2); // 没有转化类型直接算p-2*4=2008
printf("%x\n",(float*)p-2); // 指针f解引用后float是4字节,因此也是2008
printf("%x\n",(short*)p-2); // 同理short字节数为2,一共4个字节数,十进制的12是十六进制的c,最终为200c
printf("%x\n",(double*)p-2); // 同理double字节数为8,一共16个字节,最终为2000
printf("%x\n",(unsigned short *)p-2); // 同理unsigned short字节为2,共4个字节数,最终为200c
printf("%x\n",(char*)p-2); // 同理char为1字节,共2字节,则结果为200e
printf("%x\n",(long*)p-2); // 同理long为4字节,共8字节,则结果为2008
printf("%x\n",(unsigned long long)p-2); // 无符号long long常量,不是指针,所以仍为2个字节,则结果为200e
}