C++指针一个鲜见知识点

好吧,最近去应聘,对方给了一份题目,我表示这个题目也太偏硬件了,好多东西都没见过,或者说笔者没听过讲。当然学无止境,既然有自己不知道的知识点,那就要搞懂,现在我就来归纳一下吧,希望能给那些自学的或者学校里讲解没有偏硬件的IT人一些经验吧。

首先是:人家给了一个编程题:写一个内存拷贝函数,一开始我心想挺简单的啊.结果在往下看才知道坑爹,人家给出了函数原型:

void * MemCopy(void *dst,const void *src,size_t count);看到这个我彻底晕了,前面2个参数面前也就知道是2个指针,可是void类型,我记得Void是空的意思,然后空的指针能用?接着就是size_t,心想当初就算我完全没听讲,可是课本翻了那么多次,怎么就没看见过这个东西?这是什么类型的变量。后来翻书,结果学校里的教程还真没有这个东西。不过课本上还真有void *这种指针:void是表示空的意思,但是当void *就表示指针类型是未知的更准确的说是通用指针,也就是说:当你用这个表示一个指针变量时就是告诉编译器:我定义的这个指针,我目前不知道是什么类型的指针,编译器就会小心。这样,我们就可以将任意类型的指针都可以复制给这种指针。我们在从题目来看一下:拷贝内存,我们无法知道内存的东西是什么,当你拷贝内存的时候,如果你针对每一种类型的变量都变写一次函数的话。后果...。现在我们用void *指针的话,就是不管什么样的形参都可以代入进去。

但是怎么使用?我给一个最简单的例子

	int a= 445;
	char b[]="Hello";
	void *p;
	p = &a;
	cout<<p<<endl;//可以输出的是物理地址
	//cout<<*p<<endl;不能这样输出
	cout<<*(int *)p<<endl;//输出的是445
	p = b;
	cout<<(char *)p<<endl;//输出的是Hello
	cout<<*(char *)p<<endl;//这个是H,知道为什么吗?上一个(char *)p是指针,*(char *)p是值,提示一下,它们的差异是因为C++的输出流机制  


因为这篇文章主要是自己的笔记所以后面这点代码是给自己看的,嘿嘿

char p2[] = "hello";
	void *p1;
	p1= &p2;
//它和下面是等价的
       void *p1=p2;


 

至于什么是size_t,我查了一下,是C标准库里面的一种跨平台的变量类型,和Int很像,但是因为C/C++标准对int定义一最低的位数,而不是必需的固定位数。而且在内存里,对数的高位对齐存储还是低位对齐存储各系统都不一样。为了提高代码的可移植性,就有必要定义这样的类型变量。当然我这size_t也是找百度的,现在还是一头雾水,详情读者朋友可以自己找相关资料。

当然如果你关心这到题目怎么写的可以看看大神学的:http://blog.sina.com.cn/s/blog_78756e4901014yw5.html这个文章算是不错的,每一步都很详细。

猜你喜欢

转载自blog.csdn.net/www1157763637qqcom/article/details/16370443