c语言指针的相关面试题,有关C语言的指针面试题.pdf

有关 C 语言的指针面试题!

C语言的指针面试题“指针可以访问内存,函数中传递形参时加个*号可以改变

内容”,这基本就是很多初学者对指针的全部理解。但是一用起来就到处出错,

总是“云里雾里”,今天专门地说说指针的那些事。

1、指针的“两要素”

指针有一个初始地址,*操作取地址中的内容,++操作移动指向内存中的位置,

移动的大小由指针指向元素的类型决定。

(1)指针在内存中是什么?

所有类型的指针在内存中都是32bit(32位系统),保存了一个地址,相当于

一个unsigned int。

这一点一定要记牢了,指针就是个32位的数字,里面放的是个内存地址。

(2)指针指向的元素是什么?

指针可以指向任意的类型,常见的包括基本类型,指针,数组,函数。

指针的定义很简单,就是在指向类型前面加个,但是对于需要注意\、()、[]的

优先级问题。

·

指向基本类型的指针

·

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]。 但是由于[]的优先级比高,所以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 * 。

·

指向函数的指针

·

int func(int, float);

int (*p)(int, float) = func;

int *func(int, float);

·

函数指针的定义也是一样,在函数int func(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。

由于数组在内存中的地址是连续的,所以通过++来移动指针可以很方便地访问

下一个元素。

(2)移动 ++

指针始终指向第一个元素的起始位置,通过++指向下一个元素的起始位置。由

于数组中指向的元素类型是不同的,同样是p+1根据元素类型不同移动的字节

也相差很大。这里的下一个元素可能是下一个int,下一个double或者下一个

数组,看看下面二维的例子。

对于二维数组int matrix[3][10],可以通过下面两种方式来访问

matrix[1][1]:

*(matrix[1] + 1)

*( *

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值