指针变量
指针变量就是地址变量。换句话说,指针变量所存放的地址是可以改变的。在程序中,每一个变量都有一个地址。这些地址都可以存放在指针变量中。
为了表示指针变量和它所指向的变量之间的关系,在程序中用 *
符号表示“指向”。
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() { } |