1、指针运算
1、指针加法:指针名加数字
指针加法自动调整,调整的权重为指针类型所占字节数(sizeof(指针去掉一个*))
2、指针减法:指针名-数字
指针减法自动调整,调整的权重为指针类型所占字节数(sizeof(指针去掉一个*))
3、指针加指针:非法,无实际意义。
4、指针-指针:合法,表示间隔的单元个数(自动调整,同指针的加减法)
(1)算出间隔字节数
(2)除以调整的权重
指针-指针代码:
#include<stdio.h>
int main()
{
int arr[10] = {0};
int *p = &arr[1];//x+4
int *q = &arr[5];//x+20
printf("%d\n",p-q);//-4
printf("%d\n",q-p);//4
printf("%d\n",(short *)q-(short *)p);//8 正常情况不能转换,但只做运算而不解引用可以使用,以下同。
printf("%d\n",(long *)q-(long *)p);//4
printf("%d\n",(float *)q-(float *)p);//4
printf("%d\n",(long long **)q-(long long **)p);//4
printf("%d\n",(double *)q-(double *)p);//2
printf("%d\n",(char *)q-(char *)p);//16
printf("%d\n",(long)q-(long)p);//16没有指针,公司笔试注意坑
return 0;
}
以下代码为指针+-数的代码:
#include<stdio.h>
int main()
{
int *p = (int *)0x2010;
printf("%x\n",p-2);//2008(同类型,不进行转换,p的值为16进制2010,==2010-2*4)
printf("%x\n",(short *)p-2);//200c(强制转换成short类型指针,每个单元所占字节数减小一倍,只减2*2)
printf("%x\n",(double *)p-2);//2000(同理)
printf("%x\n",(long long ***)p-2);//2008,所有指针占4个字节;
printf("%x\n",(float *)p-2);//2008
printf("%x\n",(char *)p-2);//200e
printf("%x\n",(unsigned long long)p-2);//200e不是指针,直接转化成数。
return 0;
}
指针加法同理:
#include<stdio.h>
int main()
{
int a;
int *p = &a;
int *p = (int *)2000;//同理,2000转化成指针不能解引用,但可以进行其他的运算。
printf("%d\n",p+2);//2008,int类型指针每个占4个字节
printf("%d\n",(short *)p+2);//2004
printf("%d\n",(float *)p+2);//2008
printf("%d\n",(double *)p+2);//2016
printf("%d\n",(char *)p+2);//2002
printf("%d\n",(unsigned long)p+2);//2002
return 0;
}
2、字符串复制(要点:不要在最后省略了'\0')
题外话:字符串赋初值可以用简便方式:
char *arr[] = "xxxx";
(1)利用字符串的性质使用普通方法解决:
void MyStrcpy(char *des,char *src)
{
int i;
for(i=0;des[i] != '\0';i++)
{
des[i] = src[i];
}
des[i] = '\0';
}
(2)在(1)的基础上将数组名用指针替换:
void MyStrcpy1(char *des,char *src)
{
int i;
for(i=0;*(des+i)!='\0';i++)
{
*(des+i) = *(src+i);
}
*(des+i)='\0';
}
(3)利用形参与实参的关系,可以用指针++操作省略掉多余的变量i
void MyStrcpy2(char *des,char *src)
{
while(*src!='\0')
{
*des = *src;
src++;
des++;
}
*des = '\0';
}
(4)将赋值与++结合: