C语言-指针

内存地址

  • 字节:字节是内存的容量单位,英文名Byte,1Byte = 8Bit = 1Char
  • 地址:系统为了便于区分每一个字节而对他们逐一进行编号(编号唯一),称之为内****存地址,简称地址。

基地址(首地址)

  • 单字节数据:对于单字节数据,其地址就是其字节编号。举例:char a = 'A';
  • 多字节数据:对于多字节数据,其地址是所有字节中编号最小的那个,称为**基地址,**或者首地址

指针**==**地址

指针的目的是为了进行寻址操作,找到对应的内存。

内存

  • 虚拟内存:实际上是硬盘上的一块区域
  • 物理内存:计算机中安装的硬件内存(比如:内存条)

RAM:随机存储器,用于临时存储数据,读写速度快

  • 虚拟内存

内存总大小:4G

内存单元:每个内存单元大小 节(byte)

内存单元总数:

内存块:地址空间连续的多个内存单元

地址:每个内存单元都有一个对应的地址,我们称之为内存地址,而地址我们通常使用十六进制表示。

寻址:通过地址找到对应的内存

取地址符

  • 每个变量都是一块内存,都可以通过取地址符 & 获取其地址(基地址)。

  • 例如:

    int a = 100;
    printf("整型变量a的地址:%p\n", &a); // 0x7ffd3f7d7894 64位系统下:地址是12位16进制整数,占8字节
    char c = 'x';
    printf("字符变量c的地址:%p\n", &c); // 0x7ffd3f7d7895

  • 注意:

    • 虽然不同的变量的尺寸是不同的,但是它们的地址的尺寸是一致的。
    • 不同的地址虽然形式上看起来是一样的,但由于它们代表的内存尺寸和类型都不同,因此他们在逻辑上是需要严格区分

变量指针与指针变量

指针的概念

内存单元与地址机制

  • 内存单元划分
    • 系统将内存划分为连续的基本存储单元,每个单元的容量为1字节(8 Bits)
    • 每个内存单元 拥有唯一编号,称为内存单元(64位系统下,12位16进制表示:如: 0x7ffe382a8114 )
  • 变量的存储特性
    • 变量根据数据类型占据不同数量的内存单元:
      • char 类型占1字节(1个单元)
      • int 类型占4字节(4个单元)
      • double 类型占8字节(8个单元)
    • 变量的**基地址(首地址)**是其首个内存单元的地址(首地址一般是这一组编号中最小的那个)

指向

指针变量中存放谁的地址,就说明该指针变量指向谁。举例:

复制代码
int a = 10; // 变量a,存放常量10
int* p = &a; // 指针变量p,存放变量a的地址,此时我们可以说 指针变量p指向对象a
int b = 20;
p = &b; // 指针变量p指向对象b
double c = 12;
double *p1 = &c;

指针的本质

  • 变量指针:数据的"门牌号"(&a)
  • 指针变量:存储门牌号的"笔记本"(int *p; 指针变量存储的地址所指向的对象的类型是int类型,不能说指针变量是int类型)
  • 指向操作:通过门牌号访问数据(*p)

直接访问

  • 通过基本类型(整型、浮点型、字符型)的变量,访问这个变量代表的内存空间的数据。

  • 通过数组元素的引用(下标),访问这个引用代表的内

    // 基本类型的变量
    int a = 10 ; // 存
    printf("%d\n", a); // 取
    // 数组元素
    int arr[] = {11,22,33}; // 存
    arr[0] = 66; // 存
    printf("%d\n", arr[0]); // 取

间接访问

  • 通过指针变量,间接的访问内存中的数据。

指针变量的定义

语法:

复制代码
// 写法1
数据类型 *变量列表;
// 写法2
数据类型* 变量;

注意:指针变量的值只能是8(32位系统)| 12(64位系统)位的十六进制整数。

注意:

① 虽然定义指针变量 *a ,是在变量名前加上 * ,但是实际变量名依然为 a ,而不是 *a

② 使用指针变量间接访问内存数据时,指针变量必须要明确指向。(指向:指针变量存放谁的地址,就指向谁)

③ 如果想要借助指针变量间接访问指针变量保存的内存地址上的数据,可以使用指针变量前加 * 来间接返回访问。

④ 指针变量只能指向同类型变量,借助指针变量访问内存,一次访问的内存大小是取决于指针变量的类型。

⑤ 指针变量在定义时可以初始化,这一点和普通变量一致。(指针变量本质上还是变量,只不过存放的是地址)

指针变量的使用

使用

  • 指针变量的赋值

    // 方式1
    int a, *p;
    p = &a; // 先定义,后赋值
    // 方式2
    int a1, *p1, *q1 = &a1; // 定义并初始化
    p1 = q1; // 变量的赋值,将q1的值赋值给p1,此时q1和p1都指向了a1

  • 操作指针变量的值

    int a, *p , *q = &a;
    p = q; // 指针变量的赋值,将q的值赋值给了p,此时p,q都指向了a
    printf("%p\n", p); // 访问p的值(也就是a的地址)

  • 操作指针变量指向的值

    int a = 6, *q = &a, b = 25;
    *q = 10; // 赋值操作,修改q指向的a的值,此时 a = 10
    printf("%d,%d\n", *q, a); // 10,10
    q = &b; // 赋值操作,给指针变量q重新赋值,此时q指向b
    printf("%d,%d\n", *q, a); // 25,10

指针运算符的使用

& :取地址运算符。&a是获取变量a的地址值。这个是变量指针。

* :指针运算符、间接访问运算符,*p是指针变量p指向的对象的值。这个是指针变量。

相关推荐
海上Bruce2 小时前
C primer plus (第六版)第九章 编程练习第8,9题
c语言
深海潜水员2 小时前
【Python】 切割图集的小脚本
开发语言·python
Yolo566Q3 小时前
R语言与作物模型(以DSSAT模型为例)融合应用高级实战技术
开发语言·经验分享·r语言
Felven3 小时前
C. Challenging Cliffs
c语言·开发语言
Dreamsi_zh3 小时前
Python爬虫02_Requests实战网页采集器
开发语言·爬虫·python
今天也好累4 小时前
C 语言基础第16天:指针补充
java·c语言·数据结构·笔记·学习·算法
_君落羽_4 小时前
C语言 —— 指针(4)
c语言·开发语言
weixin_448617054 小时前
疏老师-python训练营-Day30模块和库的导入
开发语言·python
望星空听星语5 小时前
C语言自定义数据类型详解(四)——联合体
c语言·开发语言
壹立科技5 小时前
Java源码构建智能名片小程序
java·开发语言·小程序