C语言指针 (小康小白)

我是小康小白,一个平平无奇的Java小白。热爱有趣的文字,生活和远方。
个人博客:https://blog.csdn.net/weixin_45791445
有问题欢迎QQ联系:1059320343 (记得备注CSDN)
个人微信公众号:小康小白

在这里插入图片描述

首先要记住的一句话------一切都是地址

正文:

1. 内存

  1. 内存(Memory)也被称为内存储器主存储器,其作用是用于暂时存放CPU中的运算数据,我们程序必须装入内存之后才能运行。
    在这里插入图片描述

  2. 计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用 4 个字节,char 占用 1 个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。我们将内存中字节的编号称为地址(Address)或指针(Pointer)

  3. 在这里插入图片描述

  4. 在这里插入图片描述

2. 一切都是地址

  1. CPU 访问内存时需要的是地址,而不是变量名和函数名!变量名和函数名只是地址的一种助记符,当源文件被编译和链接成可执行程序后,它们都会被替换成地址。编译和链接过程的一项重要任务就是找到这些名称所对应的地址。

  2. 在这里插入图片描述

  3. 变量名和函数名为我们提供了方便,让我们在编写代码的过程中可以使用易于阅读和理解的英文字符串,不用直接面对二进制地址,那场景简直让人崩溃。

    需要注意的是,虽然变量名、函数名、字符串名和数组名在本质上是一样的,它们都是地址的助记符,但在编写代码的过程中,我们认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地址。

3. 那么什么是指针?

  1. 数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量。

  2. 在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。指针变量的值就是某份数据的地址,这样的一份数据可以是数组、字符串、函数,也可以是另外的一个普通变量或指针变量。

  3. 也就是说,定义指针变量时必须带*,给指针变量赋值时不能带*。
    在这里插入图片描述
    在这里插入图片描述

  4. 也就是说,使用指针是间接获取数据,使用变量名是直接获取数据,前者比后者的代价要高。
    在这里插入图片描述

4.指针的意义

指针的意义就是间接访问。

由于CPU的设计,很多情况下是需要寄存器去存储某个变量的内存地址,由于此时寄存器里存放的是内存地址,

所以可以直接通过这个寄存器去读写该变量值。这个就是间接访问。到了C语言里,发明了另外一种变量类型,指针变量,专门用于存放地址。

5. 指针与数组

  1. p[i] <=> *(p+i)

  2. 在数组中,指针变量每次加 1,它们的地址分别增加 4、8、1,正好是 他们对应的数据类型+(int、double、char 类型)的长度

  3. 数组在内存中只是数组元素的简单排列,没有开始和结束标志,在求数组的长度时不能使用sizeof(p) / sizeof(int),因为 p 只是一个指向 int 类型的指针,编译器并不知道它指向的到底是一个整数还是一系列整数(数组),所以 sizeof(p)求得的是 p 这个指针变量本身所占用的字节数,而不是整个数组占用的字节数。

    也就是说,根据数组指针不能逆推出整个数组元素的个数,以及数组从哪里开始、到哪里结束等信息。不像字符串,数组本身也没有特定的结束标志,如果不知道数组的长度,那么就无法遍历整个数组。

6. * 和 &

  1. 关于 * 和 & 的谜题
    假设有一个 int 类型的变量 a,pa 是指向它的指针,那么*&a和&*pa分别是什么意思呢?

    &a可以理解为(&a),&a表示取变量 a 的地址(等价于 pa),*(&a)表示取这个地址上的数据(等价于 pa 注:这里pa前有一个星号,csdn识别为了斜字符号了,没有显示)。绕来绕去,又回到了原点,&a仍然等价于 a。

    &*pa可以理解为&(*pa),*pa表示取得 pa 指向的数据(等价于 a),&(*pa)表示数据的地址(等价于 &a),所以&*pa等价于 pa。

  2. 在我们目前所学到的语法中,星号*主要有三种用途:

    • 表示乘法,例如int a = 3, b = 5, c; c = a * b;,这是最容易理解的。
    • 表示定义一个指针变量,以和普通变量区分开,例如int a = 100; int *p = &a;。
    • 表示获取指针指向的数据,是一种间接操作,例如int a, b, *p = &a; *p = 100; b = *p;。
      在这里插入图片描述
int a = 0;
int *p = &a; // 取地址,p指向了a
printf("%d\n", *p); // 取内容 *可以想成取内容符,间接运算符

兄弟们,小白写文章不容易。希望各位读者老爷不要白嫖,点赞,评论,收藏,加关注。

在这里插入图片描述

对于白嫖的兄弟们

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45791445/article/details/109021475