主页 分类 关于

C语 指针

C语学习笔记

地址 指针和变量

地址和指针的基本概念

  • 在程序中定义每一个变量, 当编译时系统就会根据程序中定义的变量的类型, 分配定字节数的存储空间内存中的每一个字节都有一个编号,也就是地址,它相当于旅馆中的房间号, 在地址所标志的单元存储数据, 这相当于旅馆中的房间住一个旅客一样

    • 变量: 命名的内存空间, 变量在内存中占有一定空间,用于存放各种类型的数据
    • 变量名: 变量名是给内存空间取的一个容易记忆的名字
* 变量的地址: 变量所使用的内存空间的地址

+ 变量值: 在变量的地址所对应的内存空间中存放的数值即为变量的值或变量的内容, &符号为取地址符号, 可以取任何变量的地址

指针通常指向常量

变量的地址

  • 概念: 内存变量简称变量, 在C语言中, 每定义一个变量, 系统就会给变量分配一块内存, 而内存是有地址的, 如果把计算机的内存区域比喻成大宾馆, 每块内存的地址就像房间的编号

    • C 语言采用运算符 & 来获取变的地址
  • 注意

    • 每次取地址不同的原因: 程序每次运行的时候, 向系统申请个内存, 系统每次随机分配个内存
    • 在printf函数中, 输入内存地址的格式控制符是 %p , 地址采用十六进制的数字显示

指针

  • 概念: 指针是一种特别变量, 全称是指针变量, 专用于存放其它变量在内存中的地址编号, 指针在使用之前要先声明

指针的声明


存储类型 数据类型 *指针变量名 [ = 初始地址值 ];
// 存储类型: 主要有 auto ( 自动 ) , register ( 寄存器 ) , staitic ( 静态 ) 和 extern ( 外部 ) 这四种 可省略

// 数据类型: 是int, char, float 等基本类型, 也可是数组等构造类型

// * 星号表示指针
">
<br>

+ 说明

* 指针变量是用来存放变量的地址的

+ 指针变量前面的 * 表示该变量为指针变量

* 一个指针变量只能指向同一个类型的变量

+ 指针变量存放地址值, 在16位系统环境下, 用两个字节表示一个地址, 所以指变量无论什么类型,其本身在内存中占用的空间是两个字节


# 对指针的赋值

- 地址是什么类型, 指针就是什么类型 一一对应

+ 地址跟指针的关系, 地址是实实在在的编号, 指针是用存放这个编号的, <font color="#DC143C">指针是用来存放地址的</font>


# 指针的应用场景

* 使用指针的好处: 减少内存开销

+ 函数的参数

* 函数的返回值

# 空指针

+ 概念: 没有赋值的指针不了 ( 没有指向内存的变量地址 ) , 对空指针操作会造成程序的 Core dump

# 野指针

* 概念: 指针指向内存已释放, 但指针的值不会被清零, 对野指针操作的结果不可预测

+ 解决方法: 代码规范化

# 数组的地址

* 概念: 在 C 语言中, 数组占用的内存空间是连续的, 数组名是数组元素的首地址, 也是数组的地址

+ C 语言数组名是数组的首地址也称为指针常量

<h4>a[i][j]找位置</h4>

<br>

~~~ C
// 5种表达式
a[i][j] // 以i和j为例子 i是行 j是列

&a[i][j]

*(a+i)+j

&a[0][0]+4*i+j

a[0]+4*i+j

相应的意思说明


&a // 表示二维数组地址

a // 表示首行地址

&a[0] // 表示首行地址

a[0] // 表示首行首元素地址

a[0][0] // 表示首行首元素的值

&a[0][0] // 表示首行首元素地址

二维数组个元素内容的关系
a[0] * (a[0]+0) * (a[0]+1) * (a[0]+2) * (a[0]+3)
a[1] * (a[0]+0) * (a[0]+1) * (a[0]+2) * (a[0]+3)
a[2] * (a[0]+0) * (a[0]+1) * (a[0]+2) * (a[0]+3)
a[0] * (*(a+0)+0) * (*(a+0)+1) * (*(a+0)+2) * (*(a+0)+3)
a[1] * (*(a+1)+0) * (*(a+1)+1) * (*(a+1)+2) * (*(a+1)+3)
a[2] * (*(a+2)+0) * (*(a+2)+1) * (*(a+2)+2) * (*(a+2)+3)

函数指针

  • C程序的每一个函数都有一个入口地址, 函数指针是指向函数入口地址的指针变量, 有了指向函数的指针变量后可以用函数指针变量调用函数, 就像用指针变量操作其他类型变量一样
  • 函数指针有两个用途: 调用函数和做函数的参数









作者: 我叫史迪奇
本文来自于: https://sdq3.link/C-Pointer.html博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议