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);

猜你喜欢

转载自www.cnblogs.com/sakurapiggy/p/13191491.html