指针笔试题和函数实现

题目

这道题到底会打印什么。

char**pa=a;等于a的首元素地址,也就是

*pa=work,然后pa后置++,越过了一串字符,所以打印at

代码运行一下看看我对不对

第二道题

这道题就比之前的难道难的多了

 根据画图可以得到这样的对应信息

第一次打印

***cpp=cp,cp的首元素地址是c+3,然后第一题打印是**++cpp,前置++,所以打印c+2位置的字符串,c+2字符串对应的是PONINT。

第二次打印

由于第一次打印++cpp,cpp的位置是在c+2的位置,在++ 就变成了c+1的位置在--,c+1位置变成c在+3打印ER

第三次打印

*cpp[-2] +3可以转换成 **(cpp-2)+3,由于第二次打印把cpp的位置改成c,然后-2那么他就是c+3的位置在解引用+3就打印ST

第四次打印

这次打印和之前打印不同没有++ --运算符,所以cpp的位置没变,还是在c的位置上

cpp[-1][-1]可以分解为  (*(cpp-1)-1) +1,cpp-1变成了c+2的位置然后在-1变成了c+1的位置c+1的位置是指向NEW的,解引用再+1,打印出来EW

运行一下代码确认下答案

第三道题

ptr1等于整个数组+1,然后-1,所以打印10

ptr2等于首元素+1,首元素加1是6的位置,再减1等于5的位置,所以打印5

运行一下

 函数实现部分

strlen

strlen这个函数的作用是用来计算字符串有多少元素的

代码

#include<stdio.h>
#include<assert.h>

int my_strlen(const char*str)
{
	assert(str);
	int count = 0;
	while (*str++)
	{
		count++;
	}
	return count;
}


int main()
{
	int len = my_strlen("abcdefg");
	printf("%d\n", len);
	return 0;
}

strcopy

strcopy复制字符串

#include<stdio.h>
#include<assert.h>

char* my_strcopy(char* left, const char* right)
{
	assert(right && left);
	char* tmp = left;
	while (*left++ = *right++)
	{
		;
	}
	return tmp;
}




int main()
{
	char arr1[] = "abcdefg";
	char arr2[100] = { 0 };
	my_strcopy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

strcat

strcat这个函数的作用是追加字串串

代码

#include<stdio.h>
#include<assert.h>

char* my_strcat(char* dest, const char* src)
{
	assert(dest && src);
	char* tmp = dest;
	while (*dest)
	{
		dest++;
	}
	while (*dest++ = *src++)
	{
		;
	}
	return tmp;
}


int main()
{
	char arr1[100] = "hello";
	char arr2[] = "world";
	my_strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值