指针变量可以关联不同的内存单元,也就是关联不同的数据。指针变量也是提高数据操作灵活性的一个重要工具。

(指针变量是指一个保存某种类型数据的地址的一块内存空间(一个字长)的命名,可用做左值,而指针通常是指指针变量的取值或某个变量的取址,用做右值,但有时指针变量也简称指针,需要在不同的上下文中去理解其微秒的差别。)

c语言指针的类型和使用方法(指针变量的三类型三步骤三状态和一体八面)(1)

可用一句话来深入概括指针变量的特性,三种类型三步骤两状态一体八面:

1 三类型

指针变量分为三种类型

1.1 明确类型的数据指针指针变量,如:

int *p; int arr2[3][4] = {0}; int (*ap2)[4] = arr2; // 数组指针

1.2 数据类型暂不确定的指针变量(void*指针),如:

int a[7] = {1,2,3,4,5,6,7}; void *vp=a; void *vq=vp; //*vp ; // error int *b = (int*)vp; *b ; // ok printf("%d\n",*b); // 2

这种指针变量(void*)在C语句中被当做泛型使用,在未确定数据类型前可以被赋一个地址值或赋值给另一个void*指针变量,但在其它的"己操作“或”他操作“前,需要强制转换为确定类型的指针变量。

1.3 函数指针

int add(int a,int b){ return a b; } main() { int (*pf)(int,int) = add; }

2 三状态

指针有三种关联状态:

2.1 无明确关联,没有初始化的指针变量声明,其状态是无明确关联的,表明指向不明确(其本身有一个历史值,是随机的,是一个垃圾值,其解引用操作用做左值时是不安全的,可能还会引发程序崩溃)。如果是一个void类型,即使被赋了一个类型明确的地址,但其本身的类型是不明确的。

2.2 空关联,指针变量可以置NULL,其状态是空关联。

2.3 明确关联:具有明确的指针类型,并且有明确的地址指向的指针其状态是明确关联的。

int a; int *p; // 无明确关联(指向不明确) void *vp = &a; // 无明确关联(vp类型不明确) p = NULL; // 空关联 p = &a; // 明确关联 int *q = (int*)vp; // 明确关联

3 三步骤

3.1 声明

int *p; // 不同于extern声明,这里同时也是定义(被分配了一个字长的内存块),有了一个历史值;

声明后在未赋值前是一个不确定性状态,其指向是不确定的。

3.2 被赋值或声明的同时初始化

int a = 12; p = &a; // 被赋值 int * q = &a; // 声明的同时被初始化

指针变量被赋值或声明的同时初始化后,有了明确的指向和状态,后续的操作才是合法和安全的操作。

3.3 操作

3.3.1 己操作,己是指指针本身,用于改变指向;

3.3.2 他操作,他是指目标对象,指针解引用用于目标对象的读写;

4 一体八面

int a[7] = {1,2,3,4,5,6,7}; int *p = a;

表格说明:

&p

p

int*

int

p

*p

操作

p

(*p)

图示:

c语言指针的类型和使用方法(指针变量的三类型三步骤三状态和一体八面)(2)

图示总结一下:

c语言指针的类型和使用方法(指针变量的三类型三步骤三状态和一体八面)(3)

-End-

,