在C语言开发中,获取内存地址是操作指针的核心前提,通过地址可以实现对变量的间接访问、动态内存操作等功能,掌握地址获取的方法是C语言入门的重要基础。

C语言获取地址的核心方式
C语言中获取变量地址最基础的方式是使用取地址符&,该符号可以直接获取对应变量在内存中的起始地址。取地址符可以作用于基本数据类型变量、数组元素、结构体成员等多种场景,获取的地址可以直接赋值给对应类型的指针变量。
基本变量地址获取
对于int、char、float等基本数据类型的变量,直接在变量名前添加&即可获取其内存地址,示例如下:
#include <stdio.h>
int main() {
int num = 10;
char ch = 'a';
float score = 95.5;
// 获取各变量的地址并输出
printf("num的地址: %pn", &num);
printf("ch的地址: %pn", &ch);
printf("score的地址: %pn", &score);
return 0;
}
上述代码中,%p是printf函数中用于输出指针地址的格式符,会将地址以十六进制形式打印出来。需要注意的是,不同运行环境下同一变量的地址可能不同,这是内存动态分配的结果。
数组地址获取
数组名本身在大多数场景下就代表了数组首元素的地址,如果需要获取整个数组的起始地址,同样可以使用&作用于数组名,两者的地址值相同,但类型含义有区别:
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
// 数组名代表首元素地址
printf("arr首元素地址: %pn", arr);
// &数组名代表整个数组的起始地址
printf("arr数组起始地址: %pn", &arr);
// 获取数组第三个元素的地址
printf("arr[2]的地址: %pn", &arr[2]);
return 0;
}
结构体成员地址获取
对于结构体变量,可以通过&获取整个结构体的地址,也可以通过&结合成员访问符获取结构体内部某个成员的地址:
#include <stdio.h>
// 定义结构体类型
struct Student {
int id;
char name[20];
float height;
};
int main() {
struct Student stu = {1, "Tom", 175.5};
printf("stu结构体的地址: %pn", &stu);
printf("stu.id的地址: %pn", &stu.id);
printf("stu.name的地址: %pn", &stu.name);
printf("stu.height的地址: %pn", &stu.height);
return 0;
}
地址的存储与使用
获取到的地址需要赋值给对应类型的指针变量才能后续使用,指针变量的类型需要和被取地址的变量类型匹配,否则可能出现类型不兼容的问题:
#include <stdio.h>
int main() {
int num = 20;
// 定义int类型指针存储num的地址
int *p = #
printf("num的值: %dn", num);
printf("num的地址: %pn", &num);
printf("指针p存储的地址: %pn", p);
// 通过指针间接访问num的值
printf("通过指针访问num的值: %dn", *p);
return 0;
}
常见注意事项
- 不能对常量使用取地址符,比如
&10这类写法是错误的,常量没有对应的可寻址内存空间。 - 不能对寄存器变量使用取地址符,因为寄存器变量存储在CPU寄存器中,没有内存地址。
- 不同编译器下地址的输出格式可能略有差异,但本质都是变量在内存中的起始位置。
- 获取地址后操作指针时,要确保指针指向的内存是合法的,避免出现野指针问题。