【C语言】深入解开指针(一)1

简介: 【C语言】深入解开指针(一)

开端

C语言中的指针😃是一种特殊的变量,它存储了一个内存地址,该地址指向另一个变量的位置。指针允许程序直接访问和操作内存中的数据,而不需要将数据复制到另一个位置。


指针在C语言中具有重要的作用,它可以用于动态内存分配、数组和字符串操作、函数传递参数等方面。通过指针,程序可以更灵活地处理内存中的数据,提高了程序的效率和性能。


看到这里,你可能会想到指针竟然有这么多的用处,但是我都不会呀?接下来博主带你一起解开指针的面纱,体会不一样的指针!


一、内存和地址

1.1 内存

在学习内存和地址之前,我们想想这个:

当我们早八要去教室上课时,我们冲到教学楼,我们怎么找到我们上课的教室呢?像教室有这么多个,我们不可能一个一个的找,不然这样很容易迟到,同样效率也就低了,但是如果我们给每个教室门口上个牌子,然后编上号:一栋教学楼—>


一楼:101,102,103…

二楼:201,202,203…

3…

有了这个教室门牌号,你就可以立马跑上去,快速找到,并签到,不会迟到。


接下来,我们把上面的案例对比我们的计算中,又会怎么样呢?


CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中,买电脑的,电脑上的内存8G/16G/32G等,这些内存空间是怎么高效的管理我们的数据的呢?


在内存中,内存划分为一个一个内存单元,每个内存单元的大小取1个字节一个字节有多大呢?

计算机中常⻅的单位(补充):

⼀个⽐特位(bit)可以存储⼀个2进制的位1或者0

bit - ⽐特位
byte - 字节
KB - 千字节
MB -兆字节
GB - 千兆字节
TB - 千千兆字节
PB - 拍字节
  1. 1byte = 8bit
  2. 1KB = 1024byte
  3. 1MB = 1024KB
  4. 1GB = 1024MB
  5. 1TB = 1024GB
  6. 1PB = 1024TB

每个内存单元也都有⼀个编号(这个编号就相当于教室的⻔牌号),有了这个内存单元的编号,CPU就可以快速找到这个内存空间。

生活中我们把门牌号也叫地址,在计算机中我们把内存单元的编号也称为地址。C语⾔中给地址起了新的名字叫:指针。

所以我们可以理解为:

内存单元的编号 == 地址 == 指针

1.2 怎么理解编址呢?

CPU访问内存中的某个字节空间,必须知道这个字节空间在内存的什么位置,而因为内存中字节很多,所以需要给内存进行编址(就如同教室很多,需要给教室编号一样)。

小知识来了:计算机中的编址,并不是把每个字节的地址记录下来,⽽是通过硬件设计完成的。也就是说计算中的编址,不是把整个地址编号记录下来,而是制造商已经在硬件层⾯上设计好了。


计算机内部有许多硬件单元,这些单元需要相互协作。协作的意思是它们至少要能够进行数据传输。但是,硬件单元之间是相互独立的,那么它们如何进行通信呢?

答案很简单,通过连接线进行通信。

CPU想读取内存中某一个数据中时,控制总线发出一个信号,CPU通过地址总线把内存中的这个位置找到,然后再通过数据总线传给CPU.

PU和内存之间也需要进行大量的数据交互,因此它们必须通过连接线进行连接。然而,今天我们要关注的是一组连接线,称为地址总线。


学到这里,同学们可能有个疑问,地址总线有多少根,怎么构建联系的呢?32位机器有32根地址总线,64位机器有64根地址总线,每根线只有两态,表⽰0,1【电脉冲有⽆】,那么⼀根线,就能表⽰2种含义,2根线就能表⽰4种含义,依次类推。32根地址线,就能表⽰2^32种含义,每⼀种含义都代表⼀个地址。地址信息被下达给内存,在内存上,就可以找到该地址对应的数据,将数据在通过数据总线传⼊CPU内寄存器。

二、 指针变量和地址

2.1 取地址操作符(&)

当我们理解了内存和地址的关系,我们再回到C语⾔,在C语⾔中创建变量其实有两种含义:

#include <stdio.h>
int main()
{
  int a = 66;内层含义
  return 0;
}

&a取出的是类型为a所占4个字节中地址较小的地址。我们知道a的地址,就能推出他剩下的三个地址了,就可以访问到他4个字节的数据。

16进制转换为2进制:

怎么观测到a的地址呢?

按F10调试起来,打开窗口找到内存窗口,4个点击哪一个都可以。

输入&取地址操作符(&a)就可以找到对应的地址,当然也可以在监视看,以下在内存中观察:


2.2指针变量和解引⽤操作符(*)

那我们通过取地址操作符(&)拿到的地址是⼀个数值,⽐如:0x006ffae0,这个数值有时候也是需要存储起来,⽅便后期再使⽤的,那我们把这样的地址值存放在哪⾥呢?答案是:指针变量中。

⽐如:

#include <stdio.h>
int main()
{
  int a = 10;
  int* pa = &a;//取出a的地址并存储到指针变量pa中
  return 0
}

指针变量也是⼀种变量,这种变量就是⽤来存放地址的,存放在指针变量中的值都会理解为地址。

2.2.1 如何拆解指针类型

我们看到pa的类型是 int* ,我们该如何理解指针的类型呢?

nt a = 10;
int * pa = &a;

这⾥pa左边写的是 int** 是在说明pa是指针变量,⽽前⾯的 int 是在说明pa指向的是整型(int)类型的对象。

那如果有⼀个char类型的变量chch的地址,要放在什么类型的指针变量中呢?

char ch = 'R';
pc = &ch;//pc 的类型怎么写呢?
答案是:
char *pc = &ch;

【C语言】深入解开指针(一)2:https://developer.aliyun.com/article/1474258

相关文章
|
21小时前
|
存储 安全 编译器
C语言指针与数组
C语言指针与数组
|
22小时前
|
C语言
C语言指针与字符串
C语言指针与字符串
|
22小时前
|
存储 C语言
C语言中的指针数组与多重指针
C语言中的指针数组与多重指针
|
22小时前
|
C语言
C语言中返回指针值的函数
C语言中返回指针值的函数
|
1天前
|
存储 安全 C语言
C语言指针与一维数组的关系深度解析
C语言指针与一维数组的关系深度解析
|
1天前
|
存储 算法 C语言
C语言指针与二维数组在函数参数传递和动态内存管理中的应用
C语言指针与二维数组在函数参数传递和动态内存管理中的应用
|
1天前
|
C语言 容器
从C语言到C++_17(list的模拟实现)list不是原生指针的迭代器(下 )
从C语言到C++_17(list的模拟实现)list不是原生指针的迭代器
5 1
|
1天前
|
C语言 计算机视觉
从C语言到C++_17(list的模拟实现)list不是原生指针的迭代器(中)
从C语言到C++_17(list的模拟实现)list不是原生指针的迭代器
9 1
|
1天前
|
存储 算法 编译器
从C语言到C++_17(list的模拟实现)list不是原生指针的迭代器(上)
从C语言到C++_17(list的模拟实现)list不是原生指针的迭代器
8 1
|
1天前
|
C语言
C语言进阶:进阶指针(下)
C语言进阶:进阶指针(下)