1、&(取地址符)
&
是“取地址符”,用于获取变量在内存中的地址。这个地址是一个指针值。
#include <stdio.h> int main() { int x = 10; int* p = &x; // 使用 & 取出 x 的地址并赋值给指针 p printf("x 的值是:%d\n", x); printf("x 的地址是:%p\n", &x); printf("p 存储的地址是:%p\n", p); printf("通过 p 解引用访问 x 的值:%d\n", *p); // 使用 * 解引用 return 0; }
2、*(解引用符 / 间接访问符)
*
有两种常见用法,其中之一就是你问的——解引用符(也叫间接访问符),用于通过指针访问指向的内存中的值。
#include <stdio.h> int main() { int x = 42; int* p = &x; // p 是指向 x 的指针 printf("x 的值:%d\n", x); // 直接访问 printf("*p 的值:%d\n", *p); // 解引用访问 *p = 100; // 通过指针修改 x 的值 printf("修改后 x 的值:%d\n", x); return 0; }
3、使用示例
#include <stdio.h> int main() { int x = 10; int *p = &x; // & 获取 x 的地址,p 是指向 x 的指针 int y = *p; // *p 解引用,获取指针 p 指向的值 printf("x 的值: %d\n", x); // 10 printf("p 是 x 的地址: %p\n", (void *)p); // 地址 printf("*p 的值(x 的值): %d\n", *p); // 10 printf("y 的值: %d\n", y); // 10 return 0; }
4、& 和 * 的常见使用场景
1)函数传参(传地址实现“引用”效果)
#include <stdio.h> void changeValue(int *p) { *p = 20; } int main() { int x = 10; changeValue(&x); // 把 x 的地址传进去 printf("x = %d\n", x); // 输出 20 return 0; }
2)动态内存分配(如 malloc)
C 中动态申请内存后,返回的是地址,要用指针接收。
#include <stdio.h> int main() { // 分配5个int int *arr = (int *)malloc(5 * sizeof(int)); arr[0] = 42; printf("arr[0] = %d\n", *arr); // 输出 20 return 0; }
3)数组与指针(数组名即地址)
#include <stdio.h> int main() { int a[3] = {1, 2, 3}; int *p = a; // 等价于 int *p = &a[0]; printf("%d\n", *(p + 1)); // 输出 2 return 0; }
4)结构体指针访问成员
#include <stdio.h> struct Point { int x; int y; }; int main() { struct Point pt = {3, 4}; struct Point *p = &pt; // 使用 -> 解引用访问成员,等价于 (*p ).x printf("%d\n", p->x); return 0; }
5)双指针(比如修改指针本身的值)
#include <stdio.h> void allocate(int **p) { *p = (int *)malloc(sizeof(int)); **p = 99; } int main() { int *ptr = NULL; allocate(&ptr); printf("%d\n", *ptr); // 输出 99 return 0; }