C语言面试题之指针实战

C语言面试题中最主要就是考察指针的使用,而指针的确就是C语言的灵魂,指针非常好用,对于指针的使用,可以看出一个程序员的修养。

最常使用来考察指针使用熟练程度的就是memcpy和strcpy。

char * strcpy( char *strDest, const char *strSrc )
{
assert( (strDest != NULL) && (strSrc != NULL) );
char *address = strDest;
while( (*strDest++ = * strSrc++) != ‘\0);
return address;
}

看,是不是很简单的代码,越是牛逼的代码就越短不是没有理由的。
这段代码其实是简化过了的,如果是要容易看懂的话,应该把简化的步骤都加上会比较好。
while( (*strDest++ = * strSrc++) != ‘\0’ );
就是while(*strSrc!=’\0’)
{
*strDest++ = * strSrc++;
}

然后就是memcpy

void *memcpy(void *dst, const void *src, size_t len)
{
	if(NULL == dst || NULL == src){
		return NULL;
	}
	char *d;
	const char *s;
	if(dst <= src || (char *)dst >= (char *)src + len){
		//没有内存重叠,从低地址开始复制
		d=(char *)dest;
		s=(char *)src;
		while(len--){
			*d++=*s++;
		}
	}else{
		//有内存重叠,从高地址开始复制
		s = (char *)src + len - 1;
		d = (char *)dst + len - 1;
		while(len--){
			*s--=*d--;
		}
	}
	return dest;
}

需要注意的是(char*)强制转换,因为void指针类型是不能够自加的。另一种说法是不同类型的指针不能直接++赋值。
memcpy比较经典,我一步步来讲解。
void *memcpy(void *dst, const void *src, size_t len)
都是void型指针。
if(NULL == dst || NULL == src){
return NULL;
}
先判断dst和src是不是空的,如果是,就返回空。这是最基本也是最重要的编程思想,算无遗策的判断。

然后是另一个判断,就是内存是否重叠,最后就是开始复制。
复制的语句需要注意的比较多,首先就是强制类型转换,这个很有考究,然后就是一个字节一个字节的复制,这个用的什么方法和语句也是很有玄机的。这些细节就可以看出程序员的素养了。

*d++=*s++;
这个就是指针比较容易混淆的地方,比较容易出错。写成d++=s++;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值