3. 指针解引用
上节课我们讲解了如何来声明一个指针变量。这节课我们来讲解如何通过 指针解引用 来操作指针指向的变量。
引用(Reference) 原本是在 C++ 中才有的数据类型,在 C++ 中,一个引用相当于一个变量的别名,用引用可以操作实际关联的变量,从而实现对原有关联变量的访问和修改。
指针解引用(Dereference) 是通过星号(*)运算符后跟一个指针(指针变量或指针常量)的运算。通过 指针解引用 运算,你可以对指针指向的内存内的数据进行取值或赋值等操作。
在 C 语言中 通过 指针解引用 ,可实现对指针指向的变量的引用操作。即通过 指针解引用 可以操作指针指向的变量,即指向变量的引用操作。
语法:
* 指针
说明
- 指针解引用 返回的数据是指针指向的变量的引用。
- 指针解引用 后能够引用的内存数据范围和指针本身的类型相关。
- 指针解引用 后能够引用的数据类型是指针类型去掉一个星号(
*)后的类型,如:指针p的类型为char*,则解引用后*p的类型为char。
示例:
// file: pionter_dereference.c
#include <stdio.h>
int main(int argc, char *argv[]) {
int x = 1;
char ch = 'A';
int *p1 = &x;
char * p2 = &ch;
// 打印x,和 *p1 值
printf("x:%d, *p1:%d\n", x, *p1);
// 通过指针 p1 修改 x 的值
*p1 = 100;
printf("x:%d, *p1:%d\n", x, *p1);
// 修改 ch 的值
ch = 'B';
printf("ch:%c, *p2:%c\n", ch, *p2);
// 打印指针 p1 和 p2 占用的内存长度。
printf("sizeof(p1):%ld, sizeof(p2):%ld\n", sizeof(p1), sizeof(p2));
// 打印指针 p1 和 p2 解引用后的数据占用的内存长度。
printf("sizeof(*p1):%ld, sizeof(*p2):%ld\n", sizeof(*p1), sizeof(*p2));
return 0;
}
运行结果如下:
weimingze@mzstudio:~$ gcc -o pionter_dereference pionter_dereference.c
weimingze@mzstudio:~$ ./pionter_dereference
x:1, *p1:1
x:100, *p1:100
ch:B, *p2:B
sizeof(p1):8, sizeof(p2):8
sizeof(*p1):4, sizeof(*p2):1
通过上述运行结果可以得出。
- 要修改 x 变量的值有两种方法,
- 直接对变量 x 赋值。
- 使用 指向 x 变量的指针 p1 再对其解引用后赋值,即
*p1 = 100也可以修改 x 变量。
- 变量 x 的值变化,则指向此变量的指针解引用的值也会随之变化,因为p1解引用后
*p1就是 x 变量。 - 指针解引用后的实际是指向的变量,因此
sizeof(*p1)的值是 4,sizeof(*p2)的值是 1。
练习:
- 完成下面的程序,并达到预期的结果。
#include <stdio.h>
int main(int argc, char *argv[]) {
int x = 100, y = 200;
int *px = &x, *py = &y;
int temp;
printf("x:%d, y:%d", x, y); // 打印: x:100, y:100
// 使用指针交换 变量 x, y 的值(禁止对 x, y 变量进行赋值运算),
// ...
printf("x:%d, y:%d", x, y); // 打印: x:200, y:100
return 0;
}