制作:方斌 C语言程序设 计教程 郧阳师范高等专科学校 计算机科学系 方城制作
制 作:方 斌 C语言程序设 计教程 郧阳师范高等专科学校 计算机科学系 方 斌 制作
制作:方斌 81变量的地址和指针 变量:代表“内存中的某个存储单元” 内存地址—内存中存储单元的编号 (1)计算机硬件系统的内存储器中,拥有大量的存储 单元(容量以1字节为单位)。为了方便管理,必须 为每一个存储单元编号,这个编号就是存储单元的 “地址”。每个存储单元都有一个惟一的地址 (2)在地址所标识的存储单元中存放数据。 注意:内存单元的地址与内存单元中的数据是两个完 全不同的概念
制 作:方 斌 8.1 变量的地址和指针 ⚫ 变量:代表“内存中的某个存储单元” ⚫ 内存地址──内存中存储单元的编号 (1)计算机硬件系统的内存储器中,拥有大量的存储 单元(容量以1字节为单位)。为了方便管理,必须 为每一个存储单元编号,这个编号就是存储单元的 “地址”。每个存储单元都有一个惟一的地址。 (2)在地址所标识的存储单元中存放数据。 ⚫ 注意:内存单元的地址与内存单元中的数据是两个完 全不同的概念
制作:方斌 ●若在程序中定义了一个变量,C语言编译器就 会根据定义的变量类型,为其分配一定字节数 的存储单元。如定义: inta;分配2个字节的内存空间 char ch;为ch分配1个字节的内存空间 double x;为x分配8个字节的内存空间 ●注意的是,C编译器为变量分配的内存空间是 连续的
制 作:方 斌 ⚫ 若在程序中定义了一个变量,C语言编译器就 会根据定义的变量类型,为其分配一定字节数 的存储单元。如定义: int a; 分配2个字节的内存空间 char ch; 为ch分配1个字节的内存空间 double x; 为x分配8个字节的内存空间 ⚫ 注意的是,C编译器为变量分配的内存空间是 连续的
制作:方斌 例如有定义: float y C编译器就为变量y分配4个连续字节的内存空 间。如图所示 内存 内存的地址120112021203120412051206 如上图所示,变量y的地址就为它所占用的4个字节内 存单元的首地址,即变量y的地址为1202
制 作:方 斌 ⚫ 例如有定义: float y; C编译器就为变量y分配4个连续字节的内存空 间。如图所示 1201 1202 1203 1204 1205 1206 y 内存 内存的地址 如上图所示,变量y的地址就为它所占用的4个字节内 存单元的首地址,即变量y的地址为1202
制作:方斌 变量地址——系统分配给变量的内存单元的起始地址 一般情况下,程序中只需通过访问变量名来存取变量 的值,这种存取方法称为“间接存取”。每个变量与 具体地址的联系是由C编译系统来完成的 ●在编译系统中,对变量的存取实际上是对它所占据的 存储单元进行操作,即对变量的地址进行操作,这种 按变量地址进行访问变量的方法称为“直接存取” ●假设有这样一个程序:
制 作:方 斌 ⚫ 变量地址──系统分配给变量的内存单元的起始地址 ⚫ 一般情况下,程序中只需通过访问变量名来存取变量 的值,这种存取方法称为“间接存取”。每个变量与 具体地址的联系是由C编译系统来完成的。 ⚫ 在编译系统中,对变量的存取实际上是对它所占据的 存储单元进行操作,即对变量的地址进行操作,这种 按变量地址进行访问变量的方法称为“直接存取” ⚫ 假设有这样一个程序:
制作:方斌 maino i int num; id Addr num|3000 scanf(%d", &num printf("num=%d\n", num C编译程序编译到该变量定义语句时,将变量num登录 到“符号表”中。符号表的关键属性有两个:一是“标识 名(id)”,二是该标识符在内存空间中的“地址 (addr)
制 作:方 斌 main() { int num; scanf("%d",&num); printf("num=%d\n", num); } C编译程序编译到该变量定义语句时,将变量num 登录 到“符号表”中。符号表的关键属性有两个:一是“标识 符名(id)” ,二是该标识符在内存空间中的“地址 (addr)” 。 id Addr num 3000
制作:方斌 为描述方便,假设系统分配给变量num的2字节存储单 元为3000和3001,则起始地址3000就是变量num在 内存中的地址。 ●变量值的存取——通过变量在内存中的地址进行 系统执行“ scanf("%d",&num);”和 “ printf("num=%dn,num);时,存取变量num值的方 式可以有两种
制 作:方 斌 ⚫ 为描述方便,假设系统分配给变量num的2字节存储单 元为 3000 和3001,则起始地址3000就是变量num在 内存中的地址。 ⚫ 变量值的存取──通过变量在内存中的地址进行 ⚫ 系统执行 “ scanf(”%d“,&num);” 和 “printf(”num=%d\n“, num);”时,存取变量num值的方 式可以有两种:
制作:方斌 (1)直接访问一直接利用变量的地址进行存取 上例中 scanf(“%d",&num)的执行过程是这样的 用变量名num作为索引值,检索符号表,找到变量 num的起始地址3000:;然后将键盘输入的值(假设为 3)送到内存单元3000和3001中。此时,变量num在 内存中的地址和值,如图所示。 2998300030023004
制 作:方 斌 3 2998 3000 3002 3004 (1)直接访问──直接利用变量的地址进行存取 上例中scanf(“%d”,&num)的执行过程是这样的: 用变量名num作为索引值,检索符号表,找到变量 num的起始地址3000;然后将键盘输入的值(假设为 3)送到内存单元3000和3001中。此时,变量num在 内存中的地址和值,如图所示
制作:方斌 printf("num=%dn",num)的执行过程,与 scanf0很相 似:首先找到变量num的起始地址3000,然后从3000 和3001中取出其值,最后将它输出 ●接访问一通过另一变量访问该变量的值 C语言规定:在程序中可以定义一种特殊的变量(称 为指针变量),用来存放其它变量的地址
制 作:方 斌 ⚫ printf("num=%d\n",num)的执行过程,与scanf()很相 似:首先找到变量num的起始地址3000,然后从3000 和3001中取出其值,最后将它输出。 ⚫ 间接访问──通过另一变量访问该变量的值 ⚫ C语言规定:在程序中可以定义一种特殊的变量(称 为指针变量),用来存放其它变量的地址
制作:方斌 指针变量 如图所示:假设定义一个这样的变量p(当然 该变量也有自己在内存中的地址2002),我 们用该变量来存储另一个变量的地址,即把变 量a的内存地址1012(当然是a所占据存储单 元的首地址)存放到变量p中 1012 20022003 101101210131014
制 作:方 斌 指针变量 ⚫ 如图所示:假设定义一个这样的变量p(当然 该变量也有自己在内存中的地址2002),我 们用该变量来存储另一个变量的地址,即把变 量a的内存地址1012(当然是a所占据存储单 元的首地址)存放到变量p中。 1012