指针变量可以关联不同的内存单元,也就是关联不同的数据。指针变量也是提高数据操作灵活性的一个重要工具。
(指针变量是指一个保存某种类型数据的地址的一块内存空间(一个字长)的命名,可用做左值,而指针通常是指指针变量的取值或某个变量的取址,用做右值,但有时指针变量也简称指针,需要在不同的上下文中去理解其微秒的差别。)
可用一句话来深入概括指针变量的特性,三种类型三步骤两状态一体八面:
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.1 无明确关联,没有初始化的指针变量声明,其状态是无明确关联的,表明指向不明确(其本身有一个历史值,是随机的,是一个垃圾值,其解引用操作用做左值时是不安全的,可能还会引发程序崩溃)。如果是一个void类型,即使被赋了一个类型明确的地址,但其本身的类型是不明确的。
2.2 空关联,指针变量可以置NULL,其状态是空关联。
2.3 明确关联:具有明确的指针类型,并且有明确的地址指向的指针其状态是明确关联的。
int a;
int *p; // 无明确关联(指向不明确)
void *vp = &a; // 无明确关联(vp类型不明确)
p = NULL; // 空关联
p = &a; // 明确关联
int *q = (int*)vp; // 明确关联
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) |
图示:
图示总结一下:
-End-
,