第5.1章 指针的概念

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

第 五 章 数 组
可以存储char类型变量的地址
指 针 的 概 念
• cPtr 是个指向char的 指针变量
C 语 言 程 序 设 计
指针变量和取地址操作符&
Example:
char c = ‟A‟; char *cPtr; cPtr = &c;
第 五 章 数 组
Байду номын сангаас
把 c 的地址赋 给 cPtr
cPtr:
main() { int a,b; scanf("%d,%d",&a,&b); if(a<b) swap(a,b); printf("\n%d,%d\n",a,b); }
5 9 5 9 5
…...
运行结果:5, 9
Another badswap.c
目标变量作为函数参数
main() { int a,b; int *pointer_1,*pointer_2; scanf("%d,%d",&a,&b); pointer_1=&a; pointer_2=&b; if(a<b) swap(*pointer_1,*pointer_2); printf("\n%d,%d\n",a,b); }
运行结果:5,9
swap(int x,int y) { int t; t=x; x=y; y=t; }
Review of goodswap.c
函数参数使用指针变量,在 函数中交换目标变量的值
swap(int *p1, int *p2) { int p; 2000 p = *p1; 2004 *p1 = *p2; 2008 *p2 = p; 200C } 2010 main() { int a,b; 2014 int *pointer_1,*pointer_2; 2018 scanf("%d,%d",&a,&b); 201C pointer_1=&a; pointer_2=&b; 2020 if(a<b) swap(pointer_1,pointer_2); printf("\n%d,%d\n",a,b); }



改变指针(本身)的值
改变指针所指的变量的值

在函数中交换的如果是指针变量呢?
swap(int *p1, int *p2) (main) 2000 { int *p; 5 p=p1; 2004 9 p1=p2; 2008 2000 p2=p; 200C 2004 } 2010 COPY (swap) main() 2014 { int a,b; 2000 2004 2018 int *pointer_1,*pointer_2; 2002 2000 201C scanf("%d,%d",&a,&b); 2000 **** 2020 pointer_1=&a; pointer_2=&b; if(a<b) swap(pointer_1,pointer_2); printf("%d,%d", *pointer_1,*pointer_2); 运行结果:5,9 }
int num; char ch = „A‟; float x;
int* numPtr = NULL; char *chPtr = NULL; float * xPtr = NULL; numPtr: chPtr: xPtr: NULL NULL NULL
第 五 章 数 组
num:
ch: „A‟
指 针 的 概 念
0x2000
’A‟
得到值为 0x2000
指 针 的 概 念
&ch
• a.k.a 地址操作符 “address operator”
C 语 言 程 序 设 计
Example:
char ch; printf(“%d%u”, &ch , &ch);
第 五 章 数 组
printf(“%o%x”, &ch, &ch);
第 五 章 数 组
指 针 的 概 念
Review of badswap.c
swap(int x,int y) { int temp; temp=x; x=y; y=temp; }
2000 2004 2008 (main) …...
5 9
(swap)
a
b
x
y temp
COPY 200C
2010 2014
第 五 章 数 组
(1)计算机的内存储器中,拥有大量的存储单元 (每个存储单元容量为1字节)。为了方便管理, 必须为每一个存储单元编号,这个编号就是存储 单元的“地址”。每个存储单元都有一个惟一的 地址。 (2)在地址所标识的存储单元中存放数据。 注意:内存单元的地址与内存单元中的数据是两 个完全不同的概念。
(main) …...
9 5 5 9 2000 2004
(swap)
整型变量a 整型变量b 指针pointer_1
指针pointer_2
2000 2004 5
...
指针p1 指针p2
整型p
运行结果:9,5
swap(int *p1, int *p2) { int *p; 2000 *p=*p1; int x; 2004 *p1=*p2; int *p=&x; 2008 *p2=*p; 200C } 2010 main() COPY 2014 { int a,b; int *pointer_1,*pointer_2; 2018 scanf("%d,%d",&a,&b); 202C pointer_1=&a; pointer_2=&b; 2030 if(a<b) swap(pointer_1,pointer_2); printf("\n%d,%d\n",a,b); }
指 针 的 概 念
C 语 言 程 序 设 计
指针变量使用说明
• 可以用操作符&将变量的地址赋给相容的指针 “compatible” pointer int aNumber; int *numPtr; numPtr = &aNumber;
第 五 章 数 组
Example :
指 针 的 概 念
• 打印指针中存放的地址值用 %p 格式转换序列
第 五 章 数 组
指 针 的 概 念
C 语 言 程 序 设 计
变量的地址
char ch = ‟A‟;
第 五 章 数 组
ch:
0x2000
’A‟
变量ch的值
指 针 的 概 念
变量ch的
内存地址
C 语 言 程 序 设 计
& 地址操作符
• 给出对象的内存地址
char ch = ‟A‟;
第 五 章 数 组
第 五 章 数 组
xPtr:
num: ch: x: „A‟
指 针 的 概 念
指针变量的类型必须 和其所指变量一致
C 语 言 程 序 设 计
指针变量的使用步骤4
§Step 4: 指针变量的解析
int num; char ch = „A‟; float x; int* numPtr = NULL; char *chPtr = NULL; float * xPtr = NULL; numPtr = &num; chPtr = &ch; xPtr = &x;
Example:
printf(“%p”, numPtr);
C 语 言 程 序 设 计
指针变量使用说明
int *numPtr;
指针未被初试化!
第 五 章 数 组
指 针 的 概 念
??? numPtr
C 语 言 程 序 设 计
指针变量使用说明
• 申明指针时,最好同时把它初始化为
NULL (一个特殊的指针常量)
numPtr: chPtr: xPtr: num:
addr num
addr ch addr of x 65 „A‟ 0.25
第 五 章 数 组
指 针 的 概 念
*xPtr = 0.25; *numPtr = *chPtr;
ch:
x:
C 语 言 程 序 设 计
变量值的存取
通过变量在内存中的地址进行
(1)直接访问──直接利用变量的地址进行存取 scanf("%d",&nNum1); 的执行过程是这样的:
Computer Programming 指针 Pointers
1
C 语 言 程 序 设 计
变量的地址
§内存中的每个变量都有地址 §程序中没有地址的东西:
寄存器变量 常数/常变量/ 预编译定义 表达式
第 五 章 数 组
指 针 的 概 念
C 语 言 程 序 设 计
内存地址
1.内存地址──内存中存储单元的编号
第 五 章 数 组
指 针 的 概 念
C 语 言 程 序 设 计
Pointers
§指针是变量 A pointer is a variable §存放内存地址 §指向某种类型变量
第 五 章 数 组
指 针 的 概 念
C 语 言 程 序 设 计
Example:
char* cPtr;
cPtr:
0x2004
指 针 的 概 念
C 语 言 程 序 设 计
指针变量的使用步骤
§Step 1: 申明指针要指向的变量
int num; char ch = „A‟; float x;
第 五 章 数 组
指 针 的 概 念
num : ch: x:
„A‟
C 语 言 程 序 设 计
指针变量的使用步骤2
§Step 2:申明指针变量
c:
指 针 的 概 念
A 0x2000
0x2000 0x2004
C 语 言 程 序 设 计
指针变量的申明
•任何类型的变量都可以有指针变量指向它 Example : int* numPtr; float* xPtr;
第 五 章 数 组
•* 的位置在类型和变量名之间的任何位置都可以 Example: int *numPtr; float * xPtr;
x:
C 语 言 程 序 设 计
指针变量的使用步骤3
§Step 3: 让指针变量指向正确的变量
int num; char ch = „A‟; float x; int* numPtr = NULL; char *chPtr = NULL; float * xPtr = NULL; numPtr = &num; chPtr = &ch; xPtr = &x; numPtr : chPtr:
第 五 章 数 组
用变量名nNum1作为索引值,检索符号表,找
到变量nNum1的起始地址0012FF7C;然后将键
盘输入的值(假设为3)送到0012FF7C起始点 四个字节的内存单元中。
指 针 的 概 念
C 语 言 程 序 设 计
变量值的存取
通过变量在内存中的地址进行
(2)间接访问──通过另一变量访问该变量的值
第 五 章 数 组
int
*numPtr = NULL;
NULL
指 针 的 概 念
numPtr
C 语 言 程 序 设 计
解析操作符
*
• 访问指针变量所指向的变量的值 • a.k.a 解析操作符 “dereferencing operator”
第 五 章 数 组
• 区别于申明指针变量时的类型定义符 *
9 5 9 9 2000 2004
(swap)
2000 2004 ****
...
…... 指针p1 指针p2
假设2000
指针p
编译警告!结果不对!
运行结果:9,9

指针变量在使用前必须赋值
结论:如何修改主调函数的变量值

将主调函数变量的地址传递给被调用函数,即实参应是变
量的地址。而形参应当使用指针变量。 在被调用函数中通过形参指针变量间接改变目标变量的值, 修改实参、形参地址所共同指向的变量 指针的两种“改变”
printf(“%p”, &ch);
打印地址的转化说明符
“conversion specifier”
指 针 的 概 念
C 语 言 程 序 设 计
Pointers
一个变量里面可以存储另外 一个变量的内存地址 memory address
0x3A15 0x2000 chPtr 0x1FFE 0x1FFF 0x2000 0x2001 0x2002 etc „A‟ ch
指 针 的 概 念
C 语 言 程 序 设 计
变量地址
2. 系统分配给变量的内存单元的起始地址 scanf("%d",&nNum1); C编译程序编译到该变量定义语句时,将变量 nNum1登录到“符号表”中。符号表的关键属性有 两个:一是“标识符名(id)” ,二是该标识符在 内存空间中的“地址(addr)” 。 为描述方便,假设系统分配给变量nNum1的4字节 存储单元为 0012FF7C, 0012FF7D, 0012FF7E和 0012FF7 F,则起始地址0012FF7C就是变量nNum1 在内存中的地址。
指 针 的 概 念
C 语 言 程 序 设 计
指针和解析操作符
Example: char c = ‟A‟; char *cPtr = NULL; cPtr = &c; *cPtr = ‟B‟;
c: cPtr: B A 0x2000 NULL 0x2000 0x2004
第 五 章 数 组
改变cPtr 所指 变量的值
相关文档
最新文档