C语言学习笔记_指针相关知识
C语言学习笔记_指针相关知识
指针数组和数组指针
// 指针数组,数组中保存10个int*变量;
int *p[10];
// 数组指针,指针变量p指向一个数组,数组是长度为5的int数组;
int (*p)[10];
对于一个符号而言,如果此符号和[] 结合,则它为数组,如果和 *结合,则为指针变量,如果和()结则为函数;
本例中的int *p[10]中,因为[]的优先级高于 *,所以认为符号p和[]结合,所以p是数组,保存的类型为int *;
本例中的int (*p)[10]中,通过括号改变了优先级,所以p是指针变量,指向int [5]的一个数组;
C++中可以通过new int[len]将一个指针变成数组,这样可以使得数组的长度不用直接写出来;
函数指针的定义
// 定义一个函数func;
void func(void);
// 定义了一个func类型的函数指针,并指向func
void (*p)(void);
p = func;
// 定义了一个strcpy函数同类型的函数指针,并指向strcpy
char* (*pFunc)(char*, const char*);
pFunc = strcpy;
// 因为函数指针过长,所以使用typedef重新定义为pType,在定义p1、p2就会很方便
typedef char* (*pType)(char*, const char*);
pType p1, p2;
typedef的一些用法
// 将结构体struct student重命名为student,
// 将指向此结构体的指针变量重命名为pStudent;
typedef struct student {
char *name;
int age;
}student, *pSthdent;
// 用typedef重定义指针变量
typedef int* PINT;
// 此二者效果都等于int * const p1,即指针是常量,但是指针指向的不是常量
const PINT p1;
PINT const p2;
// 只有这种条件下才可以使得指向的变量为常量
typedef const int* CPINT;
之所以要将结构体用typedef重命名,是因为c语言申明结构体的时候一定要加struct,所以用typedef简写,但是C++就不需要,在C++中struct和class几乎没有区别;
typedef话可以用来做中间类型的缓冲,主要为了提高代码的可移植性;
二重指针和二维数组
// 一般二重指针用于指针数组
int* array[10];
int **p;
p = array;
// 以下几种情况是等价的
array[0][0] == *(*(p+0)+0);
array[i][j] == *(*(p+i)+j);