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