指针,c语言笔记

笔记分为两个部分:

  1. 指针变量本身的内容是什么?
  2. 如何“取”指针所指向的东西?

我用最通俗易懂的方式给你解释一下。

1. 指针变量是什么?它的内容是什么?

一句话概括:指针变量是一个特殊的变量,它里面存储的不是普通的数据(比如数字、字符),而是另一个变量的内存地址。

你可以把内存想象成一条长长的街道,每个房子都有一个唯一的门牌号(这就是内存地址)。变量就是住在这个房子里的“人”(数据)。

  • 普通变量(如 int a = 10;:相当于叫 a 的人,他住在“幸福路101号”这个房子里,他本人就是数字 10
  • 指针变量(如 int *p = &a;:相当于一个“地址簿”,这个地址簿的名字叫 p,它里面只记录了一行信息:“幸福路101号”。这个门牌号就是指针变量 p内容

2. 如何“取”?—— 两个关键运算符:&*

这是操作指针的核心,你一定要分清。

a) 取地址运算符:&

  • 作用:获取一个变量的内存地址
  • 怎么用:放在变量前面。
  • 中文理解:“取……的地址”。
int a = 100;    // 定义一个普通整数变量a,并赋值为100
int *p;         // 定义一个指针变量p,它将来要指向一个整数

p = &a;         // 使用 & 运算符,取出变量a的地址,并把这个地址赋值给指针p
                // 现在,指针p的内容就是变量a的内存地址

b) 解引用运算符:*

  • 作用:根据指针变量里存储的地址,去找到并访问那个地址里存放的数据
  • 怎么用:放在指针变量前面。
  • 中文理解:“取……所指向的值”。
int a = 100;
int *p = &a;    // p保存了a的地址

printf("a的值是:%d\n", a);      // 输出:100 (直接访问a)
printf("a的值是:%d\n", *p);     // 输出:100 (通过指针p间接访问a)
                                  // *p 就相当于找到了p记录的那个门牌号(a的地址),然后进去把里面的人(数据100)带出来。

一个完整的例子

#include <stdio.h>

int main() {
    int number = 99;      // 定义一个整型变量number,值为99
    int *pointer;         // 定义一个整型指针变量pointer

    pointer = &number;    // 把number的地址赋值给pointer

    printf("1. number变量的值:%d\n", number);
    printf("2. number的地址是:%p\n", &number);
    printf("3. 指针pointer的内容(它存的是什么):%p\n", pointer); // 这个值应该和上一行一样
    printf("4. 通过pointer取出的值(*pointer):%d\n", *pointer);

    // 我们还可以通过指针来修改它指向的变量的值
    *pointer = 200;       // 这行代码的意思是:找到pointer指向的那个地址(也就是number的家),然后把200放进去。
    printf("5. 通过*pointer=200修改后,number的值是:%d\n", number); // number变成了200

    return 0;
}

输出结果可能类似于:

1. number变量的值:99
2. number的地址是:0x7ffeedd80a5c(一个十六进制地址,每次运行可能不同)
3. 指针pointer的内容(它存的是什么):0x7ffeedd80a5c(和上一行一样)
4. 通过pointer取出的值(*pointer):99
5. 通过*pointer=200修改后,number的值是:200

总结表格

表达式 中文含义 解释
int *p; 定义一个指针 声明p是一个指向int类型的指针变量。
p = &a; 取a的地址给p 获取变量a的内存地址,并将其存入指针p。
*p 取p所指向的值 根据p中存储的地址,找到并访问那个地址中的数据。
*p = 20; 给p指向的地方赋值 根据p中存储的地址,找到那个位置,并把20存入。

指针概念简洁版:

基本概念

  • 指针:存地址的变量
  • &a:取a的地址
  • *p:取p指向的值

间接访问

  • 通过指针操作数据
  • 修改*p即修改原变量

指针运算

  • p+1:移动一个类型大小
  • 指针相减:得到元素个数

数组

  • 数组名即首元素地址
  • arr[i] 等价于 *(arr+i)

函数

  • 指针参数:可修改实参
  • 传地址比传值高效

多级指针

  • int **pp:指向指针的指针
  • **pp:两次解引用
  • 会用四维指针的程序员很厉害

计算机学院的老师们的实际编程能力如何?- 知乎

特殊指针

  • NULL:空指针,不指向任何地方
  • 野指针:未初始化,危险
  • const指针:限制修改权限

注意

  • 指针大小固定(4/8字节)
  • 使用前必须初始化
  • 解引用前检查非空

核心:指针就是地址,*是取内容,&是取地址。

全部评论

相关推荐

KKorz:是这样的,还会定期默写抽查
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务