指针变量
指针变量就是地址变量。换句话说,指针变量所存放的地址是可以改变的。在程序中,每一个变量都有一个地址。这些地址都可以存放在指针变量中。
为了表示指针变量和它所指向的变量之间的关系,在程序中用 *符号表示“指向”。
- i_pointer是指针变量
- &i_pointer所存储的内容是变量的地址
- *i_pointer是i_pointer所指向的变量存储的内容,也就是变量i的内容。
因此,下面两个语句作用相同:
i=3;
*i_pointer=3;
第2个语句的含义是将3赋给指针变量i_pointer所指向的变量。
定义指针变量
定义指针变量的一般形式为:
类型说明符  *变量名;
其中,*表示这是一个指针变量,类型说明符表示该指针变量所指向的变量的数据类型。例如:
int* p1;
以上程序中,p1是一个指针变量,它的值是某个整型变量的地址。或者说p1指向一个整型变量。至于p1究竟指向哪一个整型变量,应由p1所赋予的地址来决定。再如:
int* p2;  //p2是指向整型变量的指针变量
float* p3;  //p3是指向浮点变量的指针变量
char* p4;  //p4是指向字符变量的指针变量
注意:一个指针变量只能指向同类型的变量,如 p3 只能指向浮点变量,不能时而指向一个浮点变量,时而又指向一个字符变量
指针变量的引用
指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值(初始化)。未初始化的指针变量值没有意义,不能使用。 指针变量的赋值只能赋予地址,决不能赋予任何其它数据,否则将引起错误。在C语言中,变量的地址是由编译器分配的,对用户完全透明,用户不能控制变量的具体地址。
指针运算符:
& 取地址运算符: 它返回其操作数(即一个变量)在内存中的实际地址;
* 指针运算符: 它返回其操作数(即一个指针)所指向的对象的值。
C语言中提供了地址运算符&来获取变量的地址。其一般形式为:
&变量名;
假设有整数型变量a,那么&a表示变量a的地址。再假设我们还有一个指向整型变量的指针变量p,如要把变量a的地址赋予指针变量p可以用以下方式。
int a;  //建立整数型变量a
int* p;  //建立整数指针变量p
p=&a;  //将变量a的地址赋予指针变量p
完整举例请见以下程序(无法复制本站示例代码?)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | /* 指针示例程序 太极创客 www.taichi-maker.com 此程序旨在演示如何通过指针操作来改变一个整数变量的数值。 */ void setup() {   Serial.begin(9600);   int val = 10;         // 建立整数型变量val,该变量初始值为10   int* pVal = &val;     // 建立整数型指针变量并且将val变量的地址                         // 赋值给该指针变量(pVal指向val的地址)   Serial.println("val变量原始数值:");   Serial.print("val = ");Serial.println(val);    pointerWork(pVal);          // 通过指针操作改变变量val数值   Serial.println("val变量经过指针操作后的数值:");   Serial.print("val = ");Serial.println(val);  // val变量经过pointerWork函数的操作后                                                // 数值变为了 123 } void loop() { } void pointerWork(int* pointer){   *pointer = 123; } | 
常见错误
把一个数字直接赋予指针变量是错误的,故下面的赋值是错误的:
int *p;
p=1000;  //不能将数值直接赋给指针变量
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | /* 指针示例程序 太极创客 www.taichi-maker.com 这个例子将整型数组中各个单元的值加1。 由于每次循环都将指针ptr加1 个单元, 所以每次循环都能访问数组的下一个单元。 */ int myArray[20]={0};  // 建立数组 int *ptr = myArray;   // 建立指向数组的指针 void setup() {     Serial.begin(9600);     Serial.println("修改前数组数值:");       for(int i = 0; i < 20; i++){       Serial.print(myArray[i]);       }     Serial.println("");Serial.println("");     // 通过指针对数组进行修改     for(int i=0; i<20; i++){           (*ptr)++;           ptr++;     }     Serial.println("修改后数组数值:");           for(int i = 0; i < 20; i++){       Serial.print(myArray[i]);       } } void loop() { } |