C 语言中,& 是 取地址符,而 * 是 解引用符。它们在指针操作中经常配合使用。&(取地址符)和 *(解引用符)是处理指针的核心操作符。它们是理解和使用指针的关键。它们通常一起使用,以实现间接访问和修改变量的目的。指针在C语言中非常重要,

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

推荐文档