指针运算与字符串复制

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)将赋值与++结合:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值