C语言的技术博客日记4
2018-04-05 18:12
411 查看
指针的算术运算:
1.指针+数字(有意义):需要调整,调整的权重(格子的大小)为sizeof(指针去掉一个*)
指针+1(向后移动):不是加一个字节或者加整个数组,而是加一个单元格
2.指针-数字(有意义):需要调整,调整的权重(格子的大小)为sizeof(指针去掉一个*)
指针-1(向前移动):减一个单元格
eg:
int *p=(int *)0x2010;//0x2010为十六进制
printf("%x\n",p-2);//2016-(2*sizeof(int))=2016-2*4=2008
printf("%x\n",(short *)p-2);//2016-(2*sizeof(short))=2016-2*2=200c
printf("%x\n",(unsigned long *)p-2);//2016-(2*sizeof(unsigned long))=2016-2*4=2008
printf("%x\n",(long long **)p-2);//去掉一个*后,变为一级指针,而一级指针占4个字节,即为2016-2*4=2008
printf("%x\n",(float *)p-2);//2016-(2*sizeof(float))=2016-2*4=2008
printf("%x\n",(double *)p-2);//2016-(2*sizeof(double))=2016-2*8=2000
printf("%x\n",(char *)p-2);//2016-(2*sizeof(char))=2016-2*1=200e
printf("%x\n",(unsigned long )p-2);//是数字,不是指针,直接减去,即为2016-2=200e
3.指针+指针(非法无意义)
4.指针-指针(有意义) : 表示间隔的单元个数(不是字节数)
方法:(1)算出字节数 (2)除以调整的权重
总结:指针的所有算术运算都需要调整,调整的权重为sizeof
eg:
int arr[10] ;
int *p= &arr[1];//x+4
int *q=&arr[9];//x+36
printf("%d\n",p-q);//字节数为32,-32/(sizeof(int))=-32/4=-8
printf("%d\n",q-p);//32/(sizeof(int))=32/4=8
printf("%d\n",(short *)q-(short *)p);//32/(sizeof(short))=32/2=16
printf("%d\n",(double *)q-(double *)p);//32/(sizeof(double))=32/8=4
printf("%d\n",(int ***)q-(int ***)p);//去掉一个*后,变为二级指针,占4个字节,即为32/4=8
printf("%d\n",(char **)q-(char **)p);//去掉一个*后,变为一级指针,占4个字节,即为32/4=8
printf("%d\n",(long)q-(long)p);//是数字,不是指针,直接计算为32
5.
void Mystrcpy(char *des ,char *src)
{
int = i;
for( I=0;src[I]!='\0';I++)
{
des[i]=src[I];
}
des=[i] ='\0';
}
字符串的判断依据:字符串结尾带'\0'
"[ ]"自带解引用
p [i] == *(p+i)
*(arr+i) == arr [i]
1.指针+数字(有意义):需要调整,调整的权重(格子的大小)为sizeof(指针去掉一个*)
指针+1(向后移动):不是加一个字节或者加整个数组,而是加一个单元格
2.指针-数字(有意义):需要调整,调整的权重(格子的大小)为sizeof(指针去掉一个*)
指针-1(向前移动):减一个单元格
eg:
int *p=(int *)0x2010;//0x2010为十六进制
printf("%x\n",p-2);//2016-(2*sizeof(int))=2016-2*4=2008
printf("%x\n",(short *)p-2);//2016-(2*sizeof(short))=2016-2*2=200c
printf("%x\n",(unsigned long *)p-2);//2016-(2*sizeof(unsigned long))=2016-2*4=2008
printf("%x\n",(long long **)p-2);//去掉一个*后,变为一级指针,而一级指针占4个字节,即为2016-2*4=2008
printf("%x\n",(float *)p-2);//2016-(2*sizeof(float))=2016-2*4=2008
printf("%x\n",(double *)p-2);//2016-(2*sizeof(double))=2016-2*8=2000
printf("%x\n",(char *)p-2);//2016-(2*sizeof(char))=2016-2*1=200e
printf("%x\n",(unsigned long )p-2);//是数字,不是指针,直接减去,即为2016-2=200e
3.指针+指针(非法无意义)
4.指针-指针(有意义) : 表示间隔的单元个数(不是字节数)
方法:(1)算出字节数 (2)除以调整的权重
总结:指针的所有算术运算都需要调整,调整的权重为sizeof
eg:
int arr[10] ;
int *p= &arr[1];//x+4
int *q=&arr[9];//x+36
printf("%d\n",p-q);//字节数为32,-32/(sizeof(int))=-32/4=-8
printf("%d\n",q-p);//32/(sizeof(int))=32/4=8
printf("%d\n",(short *)q-(short *)p);//32/(sizeof(short))=32/2=16
printf("%d\n",(double *)q-(double *)p);//32/(sizeof(double))=32/8=4
printf("%d\n",(int ***)q-(int ***)p);//去掉一个*后,变为二级指针,占4个字节,即为32/4=8
printf("%d\n",(char **)q-(char **)p);//去掉一个*后,变为一级指针,占4个字节,即为32/4=8
printf("%d\n",(long)q-(long)p);//是数字,不是指针,直接计算为32
5.
void Mystrcpy(char *des ,char *src)
{
int = i;
for( I=0;src[I]!='\0';I++)
{
des[i]=src[I];
}
des=[i] ='\0';
}
字符串的判断依据:字符串结尾带'\0'
"[ ]"自带解引用
p [i] == *(p+i)
*(arr+i) == arr [i]
相关文章推荐
- C语言的技术博客日记1
- C语言的技术博客日记2
- C语言的技术博客日记5
- C语言的技术博客日记3
- 黑马程序员---技术博客日记(1)
- 技术博客与技术日记
- 第六周博客技术发表 C语言代码
- 就C语言的指针、链表的原理和各类操作撰写一篇技术博客,说说自己学习C语言指针和链表的体会
- 就C语言的指针、链表的原理和各类操作撰写一篇技术博客,说说自己学习C语言指针和链表的体会,并将学生信息管理系统进行修改,使能完成其他的功能,并撰写体会,附加源代码。
- 编程日记——第一篇技术博客
- 开始写写技术博客,或许不算是技术博客,那就叫做技术日记或者技术周记吧
- 写技术博客的注意事项
- 周典章(zhoudianzhang)的技术博客,希望大家踊跃转载
- 使用静态化技术写了一个用于在手机上看的博客系统(目前只能看文章,写不了评论)
- BAT等研发团队的技术博客
- 实用技术解决方案博客地址记录
- 今天起,经营我的技术博客。
- 通过设置P3P头来实现跨域访问COOKIE_老王的技术手册 ( 我的新博客:http://huoding.com )_百度空间
- C++ 初始化函数的实现 - Ling Xu 的 C++ 技术随笔 - C++博客
- 开源版本的leaf-snowflake(基于美团点评技术团队博客http://tech.meituan.com/MT_Leaf.html)