C语言中的指针与常量、数组及函数的关系

tech2024-10-02  21

指针与常量


指针常量

int * const p; //一个常量

指针变量不允许修改,即指向的地址不能被修改,但是地址里的内容可以被修改。

常量指针

const int *p = &a; //一个指针

指针指向的变量的值不可通过该指针修改,但是指针指向的值可以改变。

指向常量的指针常量

const int * const b = &a;

既不能更改它所指向的地址,也不能修改指向地址上的值。

指针与数组


指针数组

int *p[2]; //一个数组,每个元素都是int类型的指针。

“[]”的优先级要比“*”要高,所以 p先与“[]”结合,构成一个数组,数组名为 p,而“int*”修饰的是数组的内容,即数组的每个元素。

数组指针

int (*p)[2]; //一个指针,指向含2个元素的一维数组。

“()”的优先级比“[]”高,“*”号和p构成一个指针的定义,指针变量名为p,而 int 修饰的是数组的内容,即数组的每个元素。数组指针也称指向一维数组的指针,亦称行指针。

指针与函数


指针函数

指带指针的函数,即本质是一个函数,函数返回类型是某一类型的指针。

int *f(x,y);

首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且在主调函数中,函数返回值必须赋给同类型的指针变量。

函数指针

函数指针是指向函数的指针变量,即本质是一个指针变量。

int (*f) (int x); /*声明一个函数指针 */   f=func; /* 将func函数的首地址赋给指针f */

指向函数的指针包含了函数的入口地址,可以通过它来调用函数。 例如:

void (*fptr)();

把函数的地址赋值给函数指针,可以采用下面两种形式:

fptr = &Function; fptr = Function;

取地址运算符&不是必需的,因为单单一个函数标识符就标号表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。可以采用如下两种方式来通过指针调用函数:

x = (*fptr)(); x = fptr();

第二种格式看上去和函数调用无异。但是有些人倾向于使用第一种格式,因为它明确指出是通过指针而非函数名来调用函数的。

最新回复(0)