第5.1章 指针的概念
改变指针(本身)的值
改变指针所指的变量的值
在函数中交换的如果是指针变量呢?
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 }
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); 的执行过程是这样的:
指 针 的 概 念
C 语 言 程 序 设 计
指针和解析操作符
Example: char c = ‟A‟; char *cPtr = NULL; cPtr = &c; *cPtr = ‟B‟;
c: cPtr: B A 0x2000 NULL 0x2000 0x2004
第 五 章 数 组
改变cPtr 所指 变量的值
第 五 章 数 组
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 = # chPtr = &ch; xPtr = &x;
第 五 章 数 组
指 针 的 概 念
C 语 言 程 序 设 计
变量的地址
char ch = ‟A‟;
第 五 章 数 组
ch:
0x2000
’A‟
变量ch的值
指 针 的 概 念
变量ch的
内存地址
C 语 言 程 序 设 计
& 地址操作符
• 给出对象的内存地址
char ch = ‟A‟;
第 五 章 数 组
第 五 章 数 组
指 针 的 概 念
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
指 针 的 概 念
C 语 言 程 序 设 计
指针变量的使用步骤
§Step 1: 申明指针要指向的变量
int num; char ch = „A‟; float x;
第 五 章 数 组
指 针 的 概 念
num : ch: x:
„A‟
C 语 言 程 序 设 计
指针变量的使用步骤2
§Step 2:申明指针变量
第 五 章 数 组
可以存储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); }
第 五 章 数 组
int
*numPtr = NULL;
NULL
指 针 的 概 念
numPtr
C 语 言 程 序 设 计
解析操作符
*
• 访问指针变量所指向的变量的值 • a.k.a 解析操作符 “dereferencing operator”
第 五 章 数 组
• 区别于申明指针变量时的类型定义符 *
(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); }
printf(“%p”, &ch);
打印地址的转化说明符
“conversion specifier”
指 针 的 概 念
C 语 言 程 序 设 计
Pointers
一个变量里面可以存储另外 一个变量的内存地址 memory address
0x3A15 0x2000 chPtr 0x1FFE 0x1FFF 0x2000 0x2001 0x2002 etc „A‟ ch
x:
C 语 言 程 序 设 计
指针变量的使用步骤3
§Step 3: 让指针变量指向正确的变量
int num; char ch = „A‟; float x; int* numPtr = NULL; char *chPtr = NULL; float * xPtr = NULL; numPtr = # chPtr = &ch; xPtr = &x; numPtr : chPtr:
第 五 章 数 组
指 针 的 概 念Biblioteka C 语 言 程 序 设 计
Pointers
§指针是变量 A pointer is a variable §存放内存地址 §指向某种类型变量
第 五 章 数 组
指 针 的 概 念
C 语 言 程 序 设 计
Example:
char* cPtr;
cPtr:
0x2004
指 针 的 概 念
C 语 言 程 序 设 计
指针变量使用说明
• 可以用操作符&将变量的地址赋给相容的指针 “compatible” pointer int aNumber; int *numPtr; numPtr = &aNumber;
第 五 章 数 组
Example :
指 针 的 概 念
• 打印指针中存放的地址值用 %p 格式转换序列
0x2000
’A‟
得到值为 0x2000
指 针 的 概 念
&ch
• a.k.a 地址操作符 “address operator”
C 语 言 程 序 设 计
Example:
char ch; printf(“%d%u”, &ch , &ch);
第 五 章 数 组
printf(“%o%x”, &ch, &ch);
c:
指 针 的 概 念
A 0x2000
0x2000 0x2004
C 语 言 程 序 设 计
指针变量的申明
•任何类型的变量都可以有指针变量指向它 Example : int* numPtr; float* xPtr;
第 五 章 数 组
•* 的位置在类型和变量名之间的任何位置都可以 Example: int *numPtr; float * xPtr;
第 五 章 数 组
用变量名nNum1作为索引值,检索符号表,找