地址与指针

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2005 2006
…...
1、int *p=&i; int i; 3、float i; int *p=&i; 5、int i; int *p=&i;
25
下列对哪能些指针变量赋值是正确的? 22
2、int i,*p; p=&i; 4、int i; int *p= i; 6、int i,*p; *p=i;
变量i_pointer
2000
2005
2006
指针变量

*i_pointer=20; 见P8.2图
-----间接访问 *间接访问运算 符
…...
8.2 指针变量的定义与引用
1. 指针变量与其所指向的变量之间的关系
i_pointer 2000 变量i 3 *i_pointer i &i i=3; *i_pointer i_pointer *i_pointer=3
变量必须已说明过; 并要求两者类型一致。 例 float i; 例 int *p=&i; int *p=&i; int i;
例 int i; int *p=i;
例 int i; int *p=&i; int *q=p;
用已初始化指针变量作初值
(2) 指针变量的定义\赋初值分别进行
例 int i; int *p; p=&i;
1015
1016
1017
1018
1019
2. 指针与指针变量
指针:一个变量的首地址,它是一个整数形式的常量。通过 8 它能找到该变量 指针变量:专门用来存放地址的变量叫指针变量,它的值 也可以是数组或函数的地址 。
指针
思考:它是什么类型?
…...
2000
整型变量i
变量i的首地址
2001
2003 2004 2005 2006
直接存取
6
变量实质:代表了:”内存中的某个存储单元” 7 内存的实质:以字节为单位的一片连续的存 储空间.-----每个字节都有一个编号,即” 内存地址” 内存空间是连续的,内存地址也就是连续的, 例P92 图8.1 如:short int a ,b ; float x;
1012 1013 1014
当p=&i时, scanf(“%d”,&i)等效于 scanf(“%d”,p)
19
*p=&i;
*只能用于指针变量 另外: p=1000 不合法 (不要将任何其它非地址类型的 数据赋给一个 指针变量)
20
(3) 通过指针变量获取地址值 int i; int *p, *q; p=&i; q=p; 通过指针变量p获取了地址.结果见P95图8.4 (4)通过标准函数获得地址值 P95
30
/*指针在使用前就先赋值*/
8.4.2 移动指针
§什么叫移动指针? 何时有意义? 指针变量+/- 一个整数; 或通过赋值使指针变量指向相邻的存储单元; 指针指向一串连续的存储单元,指针移动才有意 义.
指针变量只能做+/- 一个整数的运算; 不可做其它任何算术运算; p+1 p-3 p*p p/3
23
零指针:(空指针)
定义:指针变量值为零 例如: int * p=0;
p不指向任何内存块 24 系统保证该单元不作它用; 表示指针变量的值没有意义。
int *p=NULL;
p=NULL与未对p赋值不同 用途: 避免指针变量的非法引用 在程序中常作为状态比较

int *p; ...... while(p!=NULL) { ...… }
4、 取地址运算符&与指针运算符* (间接访问运算符)
含义: 取变量的地址 单目运算符 优先级: 14(第二高的级别) 结合性:自右向左 含义: 从某个地址中获取数据 单目运算符 优先级: 14 结合性:自右向左
12
两者关系:互为逆运算
§地址运算符& : 1、只能应用于变量和数组,不可以用于常量表达 13 式或者register类的变量P169. 下列合法的求地址运算是: &x &[x] &2 &(x+y) &x+y 2、&必须放在运算对象的左边,而且运算对象的 类型必须与指针变量的基类型相同. 下列哪些赋值是合法的: float a,*p; int b; *p=&b , *p=a, p=&a, p=&b, *p=&a, *p=b
28
例5 P97 int **p,*s,k=20; s=&k, p=&s;
29
例 8.1 P97
若改为p=s有何不 同?图怎么改?
#include<stdio.h> main() {int a,b,min,*pa,*pb,*pmin; pa=&a, pb=&b, pmin=&min; scanf(“%d%d”,pa,pb); printf(“a=%d b=%d”,a,b); *pmin=*pa; if(*pa>*pb) *pmin=*pb; printf(“min=%d\n”,min); }
变量i_pointer 指针变量
i_pointer-----指针变量,它的内容是地址量2000 *i_pointer----指针的目标变量i,它的内容是数据10 &i_pointer---指针变量占用内存的地址:2004
…...
例8.1 运算符“&”和“*”的使用
#include <stdio.h> void main() {int *px, x=5; px=&x; printf( "&px=0x%x,px=0x%x,*px=%d\n", &px,px,*px); printf( "*&px=0x%x,&*px=0x%x\n",*&px,&*px); printf( "&x=0x%x,x=%d,*&x=%d\n",&x,x,*&x); } 运行结果:
31
8.4.2对指针变量的操作 移动指针 a,b,c,d,*p,*q; short int
(2) 指针变量 +/- 整数新的地址 p=&b;
q=p+1; 所加的数值:整数*字节数 q=p-1; p++; ++p; 注意:*p++; *++p; 不同于 (*p)++; ++ (*p);
…... 2000 2002 2004 2006 2008 200A 整型变量a 整型变量b 整型变量c 整型变量d 指针变量p 指针变量q
…...
0x12ff78 0x12ff79 0x12ff7a 0x12ff7b 0x12ff7c 0x12ff7f
5
变量px
0x12ff78
…...
指针变量
8.3 对指针变量的赋值(地址值)
(1) 指针变量的定义的同时赋初值
18 将地址值赋给指针变量 一般形式:数据类型 *指针名=初始地址值; 例 int i; int *p=&i;
11 3、关于基类型: P94指针变量所指向的变量的类型. 问:指针变量的类型是什么?(整型) 问:为什么要对指针变量定义其基类型啦?P94 如: short int *pi; 2 float *p ; 4 注意 :指针变量的类型和指针变量基类型含义是 不一样的! pi与p移动一个单位的大小是不一样的,指针移 动是以一个存储单元为基数移动的,即: pi+1 p+1 移动的字节数不一样
25
赋值运算符左边与右边的变量含义不一样 如普通变量: x=x; 26 j=*(p+1) 比较 例2 j=*p+1与 如: int *p ,k=0; p=&k; *p=100; *p=*p+1; (?p和k里的内容是多少?)
*p出现在“=”左面表示指针所指向的存储单元; *p出现在“=”右面表示 指针所指向存储单元的内 容;
32
(3) 指针变量 - 指针变量 整数(多少个存储单元数)
q-p 1;
9 5 5 9 20 22 2002 2004
...
1Leabharlann Baidu含义 ?P98
200C 200E 2010
指针变量必须先赋值(地址值),再使用!
例 main( ) { int i=10; int *p; *p=i; 危 险! printf(“%d”,*p); } 21
…...
2000 2001 2002 2003 2004 整型变量i
10
指针变量p
随机值
例 main( ) { int i=10,k; int *p; p=&k; *p=i; printf(“%d”,*p); }
&px=0x12ff7c,px=0x12ff78,*px=5 *&px=0x12ff78,&*px=0x12ff78 &x=0x12ff78,x=5,*&x=5 (px的地址是:0x12ff7c 内部存放的是:0x12ff78 x的地址是:0x12ff78,内部存放的数是 5) 16
17
整型变量i
27
如: int *p ,k=0,j,w; p=&k; *p=100; j=*p+1;
关于*与++在指针变量中的运算 两者是同级别的,自右向左运算 例3 判断以下语句哪些与*p=*p+1;等效 *p+=1; ++*p; (*p)++; *p++; *(p+1) *(p++) 比较 *p+1与*(p+1)有何不一样?
10
变量的内容
指针变 量
变量i_pointer 2000
2007
…...
指针变量变量的地址 指向 变量 变量的值
3. 直接访问与间接访问
直接访问:按变量地址存取变量值 间接访问:通过存放变量地址的变量去访问变量
…...
9

整型变量i
i=3;
-----直接访问
2000 2001 2002 2003 2004 3 20 10
指针的目 标变量的10 数据类型 合法标识符
2. 指针变量的定义

一般形式: 数据类型 *指针名; short int *p1,*p2; float *q ; 表示定义指针变量 不是乘法运算符*
注意:P93 1、short int *p1, *p2; 与 short int *p1, p2;不一样。 2、指针变量名是p1,p2 ,不是*p1,*p2。 3、指针变量只能指向定义时所规定类型的变量。 4、指针变量定义后,变量值不确定,应用前必须先地址赋值。
内存中每个字节有一个编号-----地址 内存 0
程序中: int i;
float k;
编译或函数调用时为其分配内存单元
…...
2000 2003 2004 2005
i
k
2007
…...
变量是对程序中数据 存储空间的抽象
在程序中,我们无需知道变量的地址,只需指 名变量名,变量的地址与变量名间的联系 是由C编译系统直接完成. 即: 我们对变量的存取操作===对某个地址的 存储单元的操作 \ 直接通过变量的地址去存取变量值的方式 如:int i=3;
23
地址运算符&在scanf函数中的应用: 例:int k,*q; q=&k; scanf(“%d”,&k); 等效 scanf(“%d”,q);
14
指针运算符示例
…... 2000 2001 整型变量i
15
10
2002
2003 2004 2005 2006 2000
i_pointer = &i = &(*i_pointer) i = *i_pointer = *(&i)
1
第八章
地址和指针
本章内容
§变量的地址和指针 §指针变量的定义和基类型 §给指针变量赋值 §对指针变量的操作 §函数间的地址值的传递
2
3
4
C程序设计中使用指针可以:
使程序简洁、紧凑、高效 有效地表示复杂的数据结构 动态分配内存 得到多于一个的函数返回值
8.1 变量地址和指针
1. 变量与地址 变量的实质是?P10地址是怎么编号的?5
8.3.2 给指针变量赋”空”值(零指 针)
p=NULL;(结果是:p为空指针)逻辑上表示不指向任何内存 (1) 使用NULL预定义符时,程序前面加上 #include<stdio.h> (2) NULL的代码值为0 (3) p=NULL;等价于:p=’\0’ ; 或者 p=0;(并不是地址为0) (4) 由于非法使用指针容易引起程序的崩溃,所以一般判 断指针为空,可以判断指针是否有效.如果企图通过一 个空指针去访问一个变量存储空间,将会得到一个出 错信息. (5) 定义一个指针,如果先不用就要把它赋给NULL,不 然有可能会随意指向内存,造成程序崩溃。
关于指针使用常见错误
8.4 对指针变量的操作
有三种方式: 1 通过指针来引用一个存储单元; 2 移动指针; 3 指针比较; 8.4.1 通过指针来引用一个存储单元 *p 间接访问指针所指向的存储单元 j=&*i int *p,i=10,j; 例1: p=&i; j=*p; (等效于j=i 或 j=*&i ) j=*p+1; (等效于j=i+1 或 j=*&i+1 )
相关文档
最新文档