文档介绍:有关C语言的指针面试题!来源:作者:2015-12-0313:17C语言的指针面试题“指针可以访问内存,函数中传递形参时加个*号可以改变内容”,这基本就是很多初学者对指针的全部理解。但是一用起来就到处出错,总是“云里雾里”,今天专门地说说指针的那些事。1、指针的“两要素”指针有一个初始地址,*操作取地址中的内容,++操作移动指向内存中的位置,移动的大小由指针指向元素的类型决定。(1)指针在内存中是什么?所有类型的指针在内存中都是32bit(32位系统),保存了一个地址,相当于一个unsignedint。这一点一定要记牢了,指针就是个32位的数字,里面放的是个内存地址。(2)指针指向的元素是什么?指针可以指向任意的类型,常见的包括基本类型,指针,数组,函数。指针的定义很简单,就是在指向类型前面加个,但是对于需要注意\、()、[]的优先级问题。·指向基本类型的指针·intx=2;int*p=·指向指针的指针·int**q=·首先p是个指针,存放了x的地址。p是存放指针p的地址(不要忘了p就是个32位的数字,也是保存在内存中),二级指针q也是个32位的数字,不过里面放的就是p的地址。·指向数组的指针·intdata[8];int*p=data;intdata[10][8];int(*p)[8]=data;//指针int*p[8];//数组·定义数组的指针会稍微麻烦一点,首先数组是intdata[8],直接加上*号就变成了int*data[8]。但是由于[]的优先级比高,所以int\data[8]相当于int*(data[8]),更直白一点就是int*(p[8]),它是个数组,数组包含8个元素,每个元素类型是int*。为了改变优先级,加个括号编程int(*data)[8],data首先和*结合表明它是个指针。int(*data)[8]把(*data)拿掉就变成了int[8],说明它指向一维数组int[8]。总结下就是:int(*p)[8]是指针,指向一维数组int[8];int*p[8]是数组,数组包含8个元素,每个元素类型是int*。·指向函数的指针·intfunc(int,float);int(*p)(int,float)=func;int*func(int,float);·函数指针的定义也是一样,在函数intfunc(int,float)的名字上加个*号,就变成了int*func(int,float)。但是由于func右边的()优先级比左边的高,相当于int\func(int,float),所以它是个函数,返回的参数是个int*。解决的办法和数组指针一样,在func上加个括号就变成了int(*func)(int,float)。需要注意下的就是函数名称其实就是函数执行的入口地址,所以加不加都一样。函数指针在qsort中经常用到,和C++stl中的函数对象非常像。2、指针的操作c语言中只有一维数组,但数组中元素类型可以是任意的。所以多维数组本质上还是一维数组,只不过数组中每个元素又是一个数组。(1)取值*指针是个地址,用*号可以根据类型取到地址中的内容。如果是int*p,那么从起始地址开始取4个字节转化为int值;如果是double,那么从起始地址开始取8个字节转化为double。由于数组在内存中的地址是连续的,所以通过++来移动指针可以很方便地访问下一个