指针

C 指针

指针本质上是一种变量,而不管是何种类型的指针变量存储的都是内存地址,根据存储的内存地址就能找到指针指向的那一块内存。不同类型指针的区别只是其所存储的内存地址指向的内存中存储的数据,指针的类型表明了其所指向的内存中存储的数据的类型。

指针的作用就是存储地址,指针类型的作用是 告诉编译器如何解析该地址的数据,也就是指针的类型决定了编译器将内存中的数据解析为什么类型。

例:

#include <stdio.h>

int main(void)
{
    int a = 10;        // 定义整数变量 a,值为 10
    int *p = &a;       // 定义指针变量 p,存储 a 的地址
    int **pp = &p;     // 定义二级指针 pp,存储 p 的地址

    printf("%d\n", a);      // 输出 a 的值,即 10
    printf("%p\n", &a);     // 输出 a 的地址(十进制表示,具体值因内存地址而异)
    printf("%p\n", p);      // 输出 p 的值,即 a 的地址
    printf("%p\n", &p);     // 输出 p 的地址
    printf("%d\n", *p);     // 解引用 p,即 a 的值,10
    printf("%p\n", *pp);    // 解引用 pp,得到 p 的值,即 a 的地址
    printf("%p\n", &pp);    // 输出 pp 的地址
    printf("%d\n", **pp);   // **pp(即 *(*pp) ),先解引用 pp 得到 p 的值(即 a 的地址),再解引用 p 得到 a 的值(即 10)

    return 0;
}

总结

  1. &ap*pp 的值相同,因为 p 存储的就是 a 的地址,而 pp 存储的是 p 的地址,*pp 是指 p 存储的值即 a 的地址。
  2. *p**pp 的值相同,因为它们最终都解引用到 a,其值为 10。
  3. &ppp 的值相同,因为 pp 存储的是 p 的地址。
  4. &pppp 自身的地址。

**pp 先解引用 pp 得到 p 的值(即 a 的地址),再解引用 p 得到 a 的值(即 10)。

  • pp 存储的是 p 的地址。
  • *pp 取出 p 的值,即 a 的地址。
  • **pp 再次解引用,取出 a 的值,即 10
posted @ 2025-03-10 11:20  李彩龙  阅读(30)  评论(0)    收藏  举报