这两天比较闲,有时候会刷刷帖子,看见有很多人抱怨面试坑,刚好,我随便出几个题,也是我自己踩过的坑,那就先随便问几个吧,分享一下。
1.定义与声明问题
Q:我如果不能成功定义一个链表了,typedef struct { char *item; NODEPTR next; } *NODEPTR; 编译器报了错误信息。难道在C语言中一个结构不能包含指向自己的指针吗?如果可以,我应该怎么做?
A:C 语言中的结构当然可以包含指向自己的指针; NODEPTR 例子的问题是在声明 next 域的时候 typedef 还没有定义。为了解决这个问题, 首先赋予这个结构一个标签 (“struct node”)。然后, 声明 “next” 域为 “struct node *”, 或者分开 typedef 定义和结构定义, 或者两者都 纳。以下是一个修改后的版本:
struct node {
char *item;
struct node *next;
};
typedef struct node *NODEPTR;
在用 typedef 定义互相引用的两个结构时也会产生类似的问题, 可以用同样的方法解决。而且一样的问题至少还有三种方法能解决(可以自己想想)。
2.声明问题
Q:我想声明一个指针并为它分配一些空间, 但却不行。这些代码有什么 问题?
char *p; *p = malloc(10);
A:你所声明的指针是 p, 而不是 *p, 当你操作指针本身时 (例如当你对其赋值, 使之指向别处时), 你只需要使用指针的名字即可: p = malloc(10); 当你操作指针指向的内存时, 你才需要使用 * 作为间接操作符: *p = ’H’;(这个比较经典,面试如果问到这个问题是必问的)
3.空指针
Q:臭名昭著的空指针到底是什么?
A:语言定义中说明, 每一种指针类型都有一个特殊值 —— “空指针” —— 它与 同类型的其它所有指针值都不相同, 它 “与任何对象或函数的指针值都不相等”。 也就是说, 取地址操作符 & 永远也不能得到空指针, 同样对 malloc() 的成功调用 也不会返回空指针, 如果失败, malloc() 的确返回空指针, 这是空指针的典型用法: 表示 “未分配” 或者 “尚未指向任何地方” 的指针。 空指针在概念上不同于未初始化的指针。空指针可以确保不指向任何对象或 函数; 而未初始化指针则可能指向任何地方。(这个也比较经典和基础,也是必须要知道掌握的)
4.绕来绕去的指针
Q: a) 一个整型数
b)一个指向整型数的指针
c)一个指向指针的的指针,它指向的指针是指 向一个整型数
d)一个有 10 个整型数的数组
e) 一个有 10 个指针的数组,该指针是指向一 个整型数的。
f) 一个指向有 10 个整型数数组的指针
g) 一个指向函数的指针,该函数有一个整型 参数并返回一个整型数
h) 一个有 10 个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
A:
a) int a;
b) int *a;
c) int **a;
d) int a[10];
e) int *a[10];
f) int (*a)[10];
g) int (*a)(int);
h) int (*a[10])(int);
先更新这么多,后面还有不少,我整理整理发出来,有些问题感觉面试官自己应该也懵的,我看看有没有价值发出来。