看到这个面试题,估计很多刚学C指针的同学都会搞错.
我们知道计算机只认识0和1,所有的数据,包括图片,文字等最终都是转换成0和1来表示.
为了方便说明,我们用十六个二进制数组成的一个十六进制数来表示.
在win32系统中,内存地址是从0到2^32bit(相当于0到4GB),win32中VC6.0中指针本质就是一个占4个字节的无符号整形(unsigned int),能取0到2^32中所有的值的任一个值,即指针能向计算机内存中任何一个地址.
打印的结果如下:
上面定义的指针和其它系统能定义的所有指针在win32系统中用sizeof测试都是4.
指针有什么区别呢?
比如char *pChar和int *pInt:
pChar只是告诉程序我保存的内存地址处存放的是字符变量,编译器会使程序读取这个地址的值按字符的方式读取.char在内存中只占一个字节,*pChar那就是读取pChar保存的地址指向的内存的值,仅仅读取一个字节,把这个字符的ASCII编码返回给我.
pInt只是告诉程序我保存的内存地址处存放的是int型变量,编译器会使程序读取这个地址的值按int型变量的方式读取.int在内存中只占四个字节,*pInt那就是读取pInt保存的地址指向的内存的值,读取四个字节,把它们组合成一个int型变量返回给我.
光说不练,我们可以写个测试函数测试下
打印结果如下
所以定义指针的目的就是为了告诉编译器这个指针变量保存的地址指向的是什么类型的值,编译器使程序按指定数据类型方式来读取指针指向的内存中的数据.
我们可以把上面那个面试题改成如下
你会如愿在控制台程序中看到打印的"Hello World",并且没有任何内存泄露.
但看到这么奇怪的程序,感觉还是很别扭,正规的写法如下