信管C基础第10章-指针

更新时间:2023-08-14 16:20:01 阅读量: 人文社科 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

C基础

第十章 指针10.1 地址和指针的概念数据在内存的存放、读取方式(以变量为例):1、数据使用前的编译处理过程用户在程序设计中 定义一个变量 内存区每一个字节 有一个编号—地址 编译过程中:

1、根据变量类型,分配一定长度 的内存空间;2、变量名转换为所分配内存的地址

2、用户存取数据方式 变量名 地址 地址所标志的内存段 数据

C基础

*一个比方:旅 客 — 变量数据 旅 客 名 字 — 变量名 旅馆房间 — 内 存 区 旅馆房间号 — 地 址 查找旅客:旅客名字—房间号码—房 间—找到旅客 存取数据: 变量名 —内存地址—内存区—数 据

*注意:内存单元的地址与内存单元的内容是不同的。 内存单元地址—旅馆房间号码 内存单元内容—住在房间内的旅客。内存地址 …… 2000 2002 2004 2006 内存用户数据区 …… 331 220 …… 内存中存 放的数据

C基础

3、数据存取举例设程序中已定义三个整型变量 i, j , k,编译时系统将2000和 2001两个字节给变量i ,2002、2003给j,2004、2005给k。内存 分配示意图如下内存地址 2000

内存用户数据区…… 3

变量 i

20022004

69 ……

变量 j变量 k

printf (―%d‖,i)变量名i — 地址2000 — 取变量值3 — 送到输出设备

k=i+j变量名i — 地址2000 — 取变量值3 相加得9 — 送到K占用的2004,2005 变量名j — 地址2002 — 取变量值6

C基础

4、直接访问与间接访问直接访问: 在数据存取中,直接得到变量 i 地址然后 按变量 i

的地址存取变量 i 的值的方式。间接访问:在数据存放中,变量 i 的地址不是直接得到, 而是 存 放在另一个变量i_pointer中,须先从变量i_pointer中 获取变量 i 地址,然后按变量i地址存取变量值i的方式。

C基础

*一个比方(取抽屉A中的东西): 直接访问: 直接得到钥匙A — 打开抽屉A,取出东西 (直接获得变量 i 地址—按变量 i 地址存取变量的 i 值 ) 间接访问:钥匙A在抽屉B中—用钥匙B打开抽屉B得到钥匙A—打开抽 屉A取得东西变量i地址放在 变 量i_pointer中 读取变量i_pointer 值得到变量i的地址

按变量i地址存取i值

C基础

*间接访问例子过程:根据变量名i_pointer获得地址3010,到地址3010 读取数据,得到2000(变量i的地址),到2000地 址读取数据,得到变量i的值。内存地址 内存用户数据区 ……

20002002 2004

36 9

变量 i变量 j 变量 k

…… …… 30102000 …… 变量 i_pointer

C基础

5、指针和指针变量指针:一个变量的在内存区中的地址称为指针。通过变量的指 针,可以找到变量的存储单元,从而读取其中存放的值; 指针变量:专门用来存放指针的变量,称为指针变量。指针变 量存放的数据为另一变量的地址(指针)。 注意:指针与

指针变量的区别 指针—是一个地址,用于指向存放变量数据的内存单元; 指针变量—是一个变量,它的值是指针 例如:变量 i 的地址2000为该变量的指针,变量i_pointer是 用来存放 变量i的指针的,它是一个指针变量。

C基础

对地址的操作之前我们可以通过&运算符得到变量的地址。既然有了地址, 就应该可以对该地址进行读写。 int i=300; int j; j = &i ; 变量j 中存放的是一个数,是i的地址 但我们要如何才能把一个数如 200 存放到变量i所在的内存 中呢? 最简单的方式 i=200; 这是赋值语句,编译器会自动的把200送到i所在的内存单元 但我们如何实现直接对地址操作? j = 200; 不可行。此语句是把200送到变量j所在内存单元, 对变量i没有任何影响

C基础

指针C语言和其他语言的一个重要区别在于:C 语言提供了一种方法,使程序员可以不通 过变量名,而通过变量地址直接对变量所 在的内存单元进行操作。这样,C语言就 有了低级语言的特性,直接对地址进行操 作也更高效。 C中要直接对地址(内存)进行操作,需 要使用指针变量

C基础

10.2 变量的指针和指向变量的指针变量指针:它首先是一个地址,是指变量在内存中的地址 ; 指针变量:它是一个变量,是一个专门存放变量地址的变量,用来指向另一个变量。 变量都是有类型的,如int ,float,这里可以理解为:现在 有一种变量,它存放的数据对CPU而言表示为“地址”,但 要明白,不管是什么,都是一个“二进制”,地址也是一个 数。

指针变量的出现,解决了对内存操作的问题: 为了表示指针变量和它所指向的变量之间的联系, 在程序中用“*”表示“指向”例:假设i_pointer代表指针变量,它有一个值,这个值就是 某个变量的地址;而 *i_pointer 是i_pointer所指向的变量。所 谓的“指向”就是 i_pointer 的值所在的内存单元,见下图

C基础

指针和指向int i; int * i_pointer; i=3; i_pointer=&i; 定义一个指针变量

分配一块2字节的内存,假设地址为2000,并用符号i表示这 个地址 分配一块2字节的内存,假设地址为2004,并用符号 i_pointer代表这个地址 i=3; 然后把3写入i的地址,就是写到内存2000处 i_pointer=&i; 然后把i的地址2000写入i_pointer的地址, 就是写到内存2004处

C基础

指针和指向现在,内存中的情况如下

我们称:i_pointer指向变 量i,为什么? i i_pointer存放i的地址,通 过i_pointer,可以找到i 问题:如何给i赋值为5? i_pointer = 5;

2000 5内存 2004

i_pointer

5 3内存 2000

C语言提供一种特殊的表示方式: * i_pointer 用它表示i_pointer所指向的内存单元 *i_pointer = 5; 把5写入到i_pointer所指向的内存单元*i_pointer与 i 是等效的,都表示同一变

量,该变量存放地址为2000。 因此: ① i=5; ② *i_pointer=5 两语句作用相同,后者直接操作内存

C基础

10.2.1定义一个指针变量例: int i, j ; int *pointer_1 , *pointer_2 ; 第一条命令定义了两个整型变量 i, j; 第二条命令定义了 ①两个指针变量 pointer_1, pointer_2,它们 指向整型变量; ②两个整型变量*pointer_1, *pointer_2, 它们与 i,j为相同类型,被pointer_1, pointer_2 两个指针所指向;

C基础

*基类型:指针变量的基类型是指该指针变量可以指向的变量的 类型;

定义指针变量的一般形式: 基类型 *指针变量名例: float *pointer_3;(pointer_3是指向实型变量的指针变量,即其中存放 的应该是一个float类型变量的地址)

char *pointer_4;(pointer_4是指向字符型变量的指针变量)

C基础

指针变量指向的改变:方法:将一个该指针允许指向的变量的地址赋给该指针; 执行赋值语句之前 pointer_1 i 执行赋值语句之后 pointer_1 i 例

pointer_1=& i

定义指针变量时应注意的两点:(1)“*”表明它后面所跟的变量类型是指针型变量;需要 指出的(以上例为例),指针变量名为pointer_1,而不是 *pointer_1, *pointer_1是一个整型变量; (2)在定义指针变量时必须指定基类型。因为不同数据类型 占用的内存空间大小不同,在进行指针移动和运算时,将导 致不同的结果。如“指针值+1‖,对于基类型为整型,将向 后移动两个字节,对于基类型为实型,将向后移动四个字节;

C基础

10.2.2指针变量的引用

说明1:指针变量中只能存放地址(指针),而且“地址” 也有类型,不能把其它类型的数据赋给指针变量。 例:int p ; 为整型指针变量 float f; p = &f; p=100; 都为非法赋值。实际运行时,编译器只提出警告,程 序仍可以运行,但是往往会导致系统错误。----―该程序执行了非法操作…‖ …. 遇到问题问题需要关闭,我们对此引起的不便 表示抱歉…

C基础

思考指针变量也是变量,指针变量占多少字节 呢?它的大小又有什么含义呢?2000 内存 2004 i_pointer 3 内存 2000 整型变量i

在16位计算机中指针是2字节,在32位计算机中是4字节: 4字节表示指针变量i_pointer占4字节,而不管它所指向的 是什么,即指针变量只和编译器相关,和指向类型无关 指针的大小表示了它的”寻址能力“,4字节最多可以表示 的地址是:0xffffffff,即232=4G

C基础

指针的运算符有关的两个运算符: (1)& :取地址运算符; (2)*:指针运算符(或称为“间接访问”运算符) 例:&a为变量a的地址,*p为指针变量p所指 向的存储单元; 注意:*有多重含义: int* p; *p=3; p*3;

例程说明 例

C基础

二. 指针变量的引用 p1 a 例10.1 100 *p1 &a main( )

{ p2 b int a , b ; 10 *p2 &b int *p1 , *p2 ; a = 100 ; b = 10 ; p1 = &a ; p2 = &b ; printf ( “ %d , %d \n ”, a , b ) ; /*直接访问方式*/ printf ( “ %d , %d \n ”, *p1 , *p2 ) ; /*间接访问 } 结果: 100 , 10 100 , 10 程序中: *p1表示指针变量 p1所指向的变量,即 a . *p2表示指针变量 p2所指向的变量,即 b .

C基础

关于 & 与 * 运算符的说明: 1: & 是取地址运算符. 如: &a , &b 等. * 是指针运算符. 用于定义时表示其后的标识 符是指针变量.而在程序中*p 则表示指针变量 p 所指向的变量,即目标变量。 2. & , * ,+ + , – – 同优先级, 按从右至左方向结合.

C基础

a: 如: int a, *p1, *p2 ; p1 = &a ; 则: &*p1 与 &a 等效 p2=&*p1 ; 或 p2=&a ; 则: p2 也指向变量 a . b: 如: int a, *p1 ; p1 = &a ; 则: *&a 与 *p1 等效, 即等价于变量a . p1 a *p1 &a *&a c: 如: int a, *p1; p1 = &a ; 则: (*p1) + + 等价于 a + + 但注意 *p1+ + 不等价于 (*p1) + +*p1+ + 等价于 *( p1+ + ) 即先得 p1 所指向变量的值,再使 指针变量 p1的值自增,此时 p1 已不在指向原来的变量了.

本文来源:https://www.bwwdw.com/article/s2tj.html

Top