1、什么是指针?
直接引用:直接通过变量名来读写变量;
间接引用:先通过变量名访问另一个变量的地址,再通过另一个变量来访问读写;
用来存放变量地址的变量,就称为"指针变量"。
2、指针的定义
* 符号是一个说明符号,用来告诉系统这是一个指针变量
指针变量的类型限制此指针变量只能指向该类型的变量地址
// 定义了一个只能指向整型的指针变量int *p;// 定义了一个只能指向字符的指针变量char *q;
3、指针的初始化
指针先定义,再初始化
// 定义了一个int类型的变量int a = 10;// 定义了一个指向int类型的指针变量int *p;// 将变量a的地址赋值给p,所以指针变量p指向变量ap = &a;// 通过指针变量来修改变量a的值,*符号代表访问到指向的变量的值*p = 20;
在定义的同时初始化
// 定义了一个int类型的变量int b = 10;// 定义了一个指向int类型的指针变量// 将变量a的地址赋值给q,所以指针变量p指向变量bint *q = &b;
4、初始化指针需注意事项
// 1、指针p未指向地址,不能随意赋值char *p;*p = 10;// 2、指针q的地址不能随意自己赋值char *q;q = 100;
5、指针所占用的内存空间
在同一编译器环境下,一个指针变量所占用的内存空间是固定的。
指针变量所占用的内存空间随编译器环境的变化而变化,但与数据类型无关,比如16位编译器环境下 int 和 char 类型的指针变量所占的内存是一样的
6、指针为什么还要分类型?
上面说到,指针变量所占用的内存空间与数据类型无关,那为什么又要分类型呢,统一起来不是更方便。
举个例子说明指针变量的类型有什么作用:
// 首先是在16位编译器下#includeint main() { int i = 2; char a = 1; char *p = &a; printf("a = %d\n", *p); // 输出的是:a = 1 // 但是如果上面的指针p类型换成int // int *p = &a; // printf("a = %d\n", *p); // 输出的是:a = 513 return 0;}
这就是为什么指针需要分类型,int 和 char 的指针变量p两次的值不一样,来看看内存分析吧:
1、当指针变量p还是char类型或int类型,p都是占用2个字节
2、当p是char类型时,指针会读取一个字节的数据,即 0000 0010 = 1
3、当p是int类型时,指针会读取两个字节的数据,即 0000 0010 0000 0001 = 513