指针,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字节)
  • 使用前必须初始化
  • 解引用前检查非空

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

全部评论

相关推荐

查看25道真题和解析
点赞 评论 收藏
分享
点赞 评论 收藏
分享
麦当劳面试,说起来有点抽象因为我提前了几分钟进面试间,也是早早的就开始了,面试官共三人:HR+2个技术;摄像头对者两名技术面试官一开始自我介绍,巴拉巴拉,然后就是两个技术面试官换着提问。介绍一下项目的重难点!以及怎么解决的。主要是根据你简历里面来问的八股:浏览器的存储机制?当时为什么选用pinia?Vue中vuex和pinia有什么区别?React里面常用的哪些钩子?看过这些源码吗?React里面diff算法什么?以及怎么样理解Fiber?你对Webpack和Vite了解多少用过吗?他们之间的区别有哪些?怎么实现打包的?说一下你对TS的了解?性能优化有哪些方式?尽量多说几种只记得以上的一些问题,还有些记不得了!最搞笑的是我的反问环节:我提问你们是做什么业务的,男面试官说“我们是卖汉堡的!”我回复说:“那正好,我也是麦当劳忠实吃货,我经常吃汉堡,怎么买才更加优惠!”。一个小插曲就这样发生了。最后了解,他们他们是基于RN进行开发的,主要是小程序和app,B端也有一部分。最后也开心的结束了面试,面试结果一到两周才出,也是非常的man哈!最后也是评价一下面试体验:体验感不错,面试官表达清晰,男面试官比较幽默,女面试官比较和蔼亲切吧。期间大家都沉默了十几秒:估计是两个面试官相互等对方问问题吧!笑死
查看13道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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