【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

相关文章
|
8月前
|
存储 人工智能 Java
一文轻松拿捏C语言的指针的基础使用
本文介绍了C语言中的指针概念,包括直接访问和间接访问内存的方式、指针变量的定义与使用、取址运算符`&`和取值运算符`*`的应用,帮助读者深入理解指针这一C语言的核心概念。君志所向,一往无前!
146 0
|
10月前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
308 7
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
10月前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
1147 9
|
10月前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
286 7
|
11月前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
11月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
11月前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
614 3
|
11月前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
11月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
11月前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
211 1