1. 指针的本质:内存地址的变量
指针在C语言中扮演着独特而关键的角色。要真正理解指针,我们需要从计算机内存的基本工作原理说起。计算机内存被组织为一系列连续的存储单元,每个单元都有唯一的地址标识。当我们声明一个普通变量时,比如int a = 10;,系统会在内存中分配一块空间来存储这个整数值10。
指针变量与普通变量的本质区别在于:普通变量存储的是具体的数据值,而指针变量存储的是内存地址。我们可以把内存想象成一栋巨大的公寓楼,每个房间都有唯一的门牌号(地址),房间里的物品就是存储的数据。指针就像是记录着某个房间门牌号的便签纸。
c复制int var = 20; // 在某个内存位置存储整数值20
int *ptr = &var; // ptr变量存储的是var的内存地址
这里&运算符用于获取变量的内存地址。通过指针,我们不仅知道数据存储在哪里,还能间接访问和修改这些数据。这种间接访问的能力赋予了C语言极大的灵活性和效率。
2. 指针的声明与基本操作
2.1 指针的声明语法
指针变量的声明遵循特定的语法规则:
c复制type *pointer_name;
其中type是指针指向的数据类型,*表示这是一个指针变量。例如:
c复制int *ip; // 指向整型的指针
double *dp; // 指向双精度浮点型的指针
char *cp; // 指向字符型的指针
值得注意的是,指针变量本身也需要占用内存空间(通常是4或8字节,取决于系统架构),它存储的是目标数据的内存地址,而不是数据本身。
2.2 指针的基本操作
指针有三个基本操作:取地址、解引用和赋值。
c复制int var = 42;
int *ptr;
// 取地址操作
ptr = &var; // 将var的地址赋给ptr
// 解引用操作
printf("%d", *ptr); // 输出42,*ptr访问ptr指向的值
// 指针赋值
int *ptr2 = ptr; // ptr2现在也指向var
指针的算术运算有其特殊性。对指针进行加减运算时,实际移动的字节数取决于指针指向的数据类型大小:
c复制int arr[3] = {10, 20, 30
