1 常量指针!如 int b, c; int * const a = &b;
表示a是一个常量指针它指向变量b的内存。但是因为是常量指针所以不能再用a指向其他变量,如 a = &c; 错误!可以修改指向内存的值,如:*a = 20;
常量指针声明的时候必须向我那样赋初值。
2 指向常量的指针!如 int b, c; int const *a; a = &b; a = &c;
都可以,唯独它指向的内存不能被修改。如:*a=20;这是违法的!错误!
要判断到底那个是 const 其实很简单在 * 上划一条竖线,const 位于那边就是修饰其对应的右边
|
const char * p; // const 修饰 *p;
|
|
char const * p; // const 修饰 *p;
|
|
char * const p; // const 修饰 p;
|
怎样建立和理解非常复杂的声明?例如定义一个包含N个指向返回指向字符的指针的函数的指针的数组?
这个问题至少有以下2种答案:
1. char *(*(*a[N])())();
2. 用typedef 逐步完成声明:
typedef char *pc; /* 字符指针*/
typedef pc fpc(); /* 返回字符指针的函数*/
typedef fpc *pfpc; /* 上面函数的指针*/
typedef pfpc fpfpc(); /* 返回函数指针的函数*/
typedef fpfpc *pfpfpc; /* 上面函数的指针*/
pfpfpc a[N]; /* 上面指针的数组*/
我似乎不能成功定
义一个链表。我试过typedef struct { char
我似乎不能成功定义一个链表。 我试过
typedef struct {
char *item;
NODEPTR next;
} *NODEPTR;
但是编译器报了错误信息。难道在C语言中一个结构不能包含指向自己的指针吗?
C 语言中的结构当然可以包含指向自己的指针;NODEPTR 例子的问题是在声明next域的时候typedef还没有定义。为了解决这个问题,首先赋予这个结构一个标签(“struct node”)。然后,声明“next” 域为“struct node *”, 或者分开typedef 定义和结构定义, 或者两者都采纳。以下是一个修改后的版本:
struct node {
char *item;
struct node *next;
};
typedef struct node *NODEPTR;
我总算弄清除函数指针的声明方法了, 但怎样才能初始化呢?
用下面这样的代码
extern int func();
int (*fp)() = func;
当一个函数名出现在这样的表达式中时, 它就会“蜕变” 成一个指针(即, 隐式地取出了它的地址), 这有点类似数组名的行为。通常函数的显示声明需要事先知道(也许在一个头文件中)。因为此处并没有隐式的外部函数声明(初始式中函数名并非一个函数调用的一部分)。