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;
}