地址与指针

合集下载

大学C++第5章指针的应用

大学C++第5章指针的应用
例如: int *p; p=0; ②另外,也不能把常量或表达式的地 址赋给指针变量。 例如:
00:22
前一页 休息
int *p, i=0; p=&67; p=&(i+5);
10
③指针变量是有类型的,所以给指针变 量赋的值不但要是一个地址,而且应该是 一个与该指针变量类型相符的变量的地址。 例如:float f=34.5, *fptr=&f;
C
二、指针变量的关系运算
表示所指变量在内存中的位置关系。 例如:两个指针变量p1、p2指向同一数
组中的元素时:
若p1==p2:表示p1和p2指向数组中 的同一个元素;
若p1<p2:表示p1所指的数组元素在p2所 指的数组元素之前; 若p1>p2:表示p1所指的数组元素在p2所 指的数组元素之后。
变量的数据类型。 例如:int *p;
00:22
前一页 休息 7
3. 在指针定义中,一个“*”只能表示 一个指针变量。
例如:int *p1,p2;
4. 允许声明void类型的指针变量,可以 存储任何类型变量的地址。 例如: void *general; int *point, i; general=&i; point=(int *)general;
x<=*(t+p)停止,此时p即为插入点位置。
重复比较是一个循环操作,循环条件为 x>*(t+p),为了保证位置操作只在数组中进 行,增加一个位置限制p<N。
确定插入位置的程序代码为:
p=0;
t=a;
while (x>*(t+p)&&p<N)
p++;

C语言程序设计_谭浩强_第二版_CH10

C语言程序设计_谭浩强_第二版_CH10

}
第十章 指针 10.3 数组的指针和指向数组的指针变量 10.3.2 通过指针引用数组元素 例10.5输出数组中的全部元素。 ②通过数组名计算数组中元素的地址,找出元素的值。
main() {
int a[10],i; for(i=0;i<10;i++){scanf(“%d”,&a[i]);} print(“\n”); for(i=0;i<10;i++){printf(“%d”,*(a+i));} print(“\n”);
}
运行结果为: 100,10 100,10
第十章 指针 10.2 变量的指针和指向变量的指针变量
10.2.1指针变量的引用 例10.1 通过指针变量访问整型变量
pointer_1 &a
a 100 *pointer_1
pointer_2 &b
b 10 *pointer_2
第十章 指针 10.2 10.2 变量的指针和指向变量的指针变量
10.2.1指针变量的引用 例10.3 通过指针变量访问整型变量
pointer_1 &a
a 5 *pointer_1
pointer_2 &b
b 9 *pointer_2
第十章 指针 10.2 变量的指针和指向变量的指针变量
10.2.1指针变量的引用 例10.3 通过指针变量访问整型变量
b 5 *pointer_2
&b
第十章 指针 10.2 变量的指针和指向变量的指针变量
10.2.1指针变量的引用 例10.3 通过指针变量访问整型变量
pointer_1 &a
a 9 *pointer_1

第十章 指针

第十章 指针

19
10.4 字符串与指针
字符串的表示形式
1. 可以用字符数组表示字符串
main() { char string[]=”I love China!”; printf(“%s\n”, string); }
2. 可用字符指针变量来表示
main() { char *string=”I love China!”; printf(“%s\n”, string); }
9
10.2.2 指针变量的引用
& :取地址运算符 * :指针运算符
i_pointer-----指针变量,它的内容是地址量 Eg10.1 *i_pointer----指针的目标变量,它的内容是数据 &i_pointer---指针变量占用内存的地址 main() &*i_pointer等价于i_pointer { (&*i_pointer)++与&*i_pointer++的区别 int a,b; int *pointer_1,*pointer_2; a=100;b=10; pointer_1=&a; pointer_2=&b; printf("%d,%d\n",a,b); printf("%d,%d\n",*pointer_1,*pointer_2); }
21
10.5 指向函数的指针
赋值 函数名代表该函数的入口地址。因此,可用 函数名给指向函数的指针变量赋值。 指向函数的指针变量=[&]函数名;
注意:函数名后不能带括号和参数;函数名前的 “&”符号是可选的。
调用格式 (*函数指针变量)([实参表])
22
用指向函数的指针作函数参数

c语言指针与地址的区别

c语言指针与地址的区别

c语⾔指针与地址的区别
指针由两部分组成,指针的类型和指针的值(也就是变量的地址)。

指针和地址的区别:
地址只是⼀堆⼗六进制的字符,对应着内存条的某段内存,⽽指针本⾝有地址,指针的值也是⼀个地址,指针本⾝还有类型,这与单纯的地址是不同的。

指针和地址的联系:
地址可以强转成⼀个指针,例如:
int a = 1;
//假设a的地址是0x7dfe88
int *p = (int *)0x7dfe88;
附:指针类型的作⽤:
指针的值只是存储了某个变量的⾸地址,但是变量是有类型的,⽐如char是1个字节,int是4个字节,单纯的知道某个变量的⾸地址并⽆法完整的获取整个变量的值,必须知道从⾸地址往下读取多少个字节,指针的类型标明了从⾸地址往下读取多少个字节。

c语言 高级 教程 第五章

c语言 高级 教程 第五章
在调用程序
a:
b: 在swap px: py:
指针和函数的变元(续)

指针变量使函数可以存取和改变调用函数中的数据对象。getint是一个函 数,它把输入中的数字字符串读入并转换为整数,但有时读入的数无法转 换成整数,此时要返回一个信息,报告此事实(避免冲突需两个通道):
#include <ctype.h> int getch(void); void ungetch(int); /*getint: get next interger from input into *pn*/ int getint(int *pn) { int c, sign; while (isspace(c = getch( ))) ; if (!isdigit(c) && c != EOF && c !=„+‟ && c !=„-‟){ ungetch(c); return 0; } sign = (c == „-‟) ? -1 : 1; if (c == „+‟ || c == „-‟) c = getch( ); for ( *pn = 0; isdigit(c); c = getch( ) ) *pn = 10 * *pn + (c - „0‟); *pn *= sign; if (c != EOF) ungetch(c); return c; }
5.1 指针和地址

内存是线性组织的许多单元(一般称字节)组成的,每一个单元 都可以通过其序号(地址)对之存取,更大的数据对象由多个单 元组成,它们也可以通过其第一个单元的地址进行存取:
P:
C:
p = &c;

通过上述操作以后,如下关系成立: p == &c; /* 这里 &: 取出一个对象的地址*/ c == *p; /*这里 *: 取一个指针所指的对象的值(内容)*/

第9章 指针

第9章 指针

第九章指针指针是C语言的一个重要概念,也是C的一个重要特色。

正因为有了指针,C语言才可以灵活有效的表示复杂的数据结构,更方便地处理诸如内存、字符串、数组、函数等。

可以说,不掌握指针就不能掌握C的精华。

一、地址和指针的概念地址的概述1、存储器地址计算机所处理的数据,总是要存储在一定的存储介质上,例如内存。

而这些数据的存储,又是有一定先后顺序的。

因此我们通常将这些存储介质上的一个个用于存放数据的基本单元进行线性编址,即按照一定的顺序给每个存储单元(字节)一个编号,这个编号就是该单元的地址。

一般情况下,地址总是从0开始的一系列整数。

某个地址就代表某个存储单元,就如一个房间号Array码对应于一个实际的房间一样。

2、存储单元的内容这是不同于地址的另一概念,它是指某地址单元内具体存放的数据,如一个字符、一个整数、实数或一个字符串。

例:如右图100,101,102,…,205,206等即是地址;160单元的内容就是字符C,161单元的内容就是字符H,…,等。

3、变量的访问一般情况下,程序中的一个变量就对应存储器的若干个单元,对变量的访问可以简单地认为是通过变量名来对内存单元进行存取操作。

实际上,程序在编译之后,变量名已经转化为了与该变量对应的存储单元地址,因而对变量的访问就是通过地址对存储单元的访问。

1)直接访问按照变量地址来对变量进行存取的方式,称为直接访问方式。

例如:右表中对变量a的读取:printf(“%d”,a),其实是先找到a的地址160,然后从160开始读取一个字节的字符‘C’;同理用scanf(“%d”,&b)输入b的值时,在执行时,直接把从键盘输入的数据‘H’送入从地址为161开始的字节单元中。

2)间接访问通过另一变量间接获取某变量的地址,从而间接实现对原变量的访问的方式,称为间接访问方式。

例如:将变量a的地址160存放在另一个变量当中,见上表p=160,那么,对变量a的访问也可以为:先通过变量p的地址205找到该单元的数据160,再将160视为地址,该地址单元内容就是变量a的值(字符‘C’)。

指针

指针

(main)
9 5 5 9 2000 2002
(swap)
2000 2002 5
...
…...
整型变量a 整型变量b 指针pointer_1 指针pointer_2
指针p1 指针p2
整型p
例 将数从大到小输出
swap(int *p1, int *p2) { int p; 2000 p=*p1; 2002 *p1=*p2; 2004 *p2=p; 2006 } 地址传递 2008 main() 200A { int a,b; int *pointer_1,*pointer_2; 200C scanf("%d,%d",&a,&b); 200E pointer_1=&a; pointer_2=&b; 2010 if(a<b)swap(pointer_1,pointer_2); printf("\n%d,%d\n",a,b); }
#define NULL 0 int *p=NULL:
p=NULL与未对p赋值不同 用途: 避免指针变量的非法引用 在程序中常作为状态比较
例 例 char *p; int *p1; ...... void *p2; while(p!=NULL) p1=(char *)p2; { ...… p2=(void *)p1; } 表示不指定p是指向哪一种 类型数据的指针变量
…...

整型变量i
i=3;-----直接访问
2000 2001 2002 2003 2004 3 20 10
变量i_pointer 2000
2005
2006
指针变量

*i_pointer=20; -----间接访问

什么是指针

什么是指针

什么是指针
指针就是地址,而地址就是内存单元的编号。

它是一个从零开始的、操作受限的非负整数。

为什么是操作受限的?因为非负整数与非负整数可以加减乘除,但是指针和指针只能进行相减运算,不能进行其他运算,因为没有意义。

而且进行相减运算也是有条件的:只有同一块空间中的地址才能相减。

而且两个指针变量相减之后的结果是一个常量,而不是指针型变量,即相减的结果是这两个地址之间元素的个数,而不是地址的个数。

这个后面还会再讲。

内存中一个单元指的是一字节,一字节有8 位。

每根地址总线都有两种状态:0 和1。

两根地址总线就有4 种组合,能控制4个内存单元;三根地址总线就有8 种组合,能控制8 个内存单元;n 根地址总线就有2n种组合,能控制2n个内存单元。

那么CPU 总共是通过几根地址总线对内存进行处理的?一般的计算机是32 位的,即32 根地址总线,那么就能够控制232个内存单元,即232字节。

232B=4GB,所以32 位系统的计算机只能控制4GB 的内存。

高中信息技术 指针课件

高中信息技术 指针课件
q=*&k;
下面的语句取指针变量p所指向的存储单 元中的内容加1后赋给变量q。
q=*p+1;
7.3.2 移动指针
• 移动指针就是通过赋值运算,对指针变量加上或减去一个 整数,使指针变量指向相邻的存储单元。因此,只有指针变量 指向一片连续的存储单元时,指针的移动才有意义。
• 移动指针时,系统会根据指针的基类型自动地确定移动的
7.3.1 引用存储单元
两个与指针变量有关的运算符:
❖ &:取地址运算符。为取地址运算符,其作用是返 回操作对象(变量或数组元素)的地址。
例如,“&x;”返回变量x的地址,“&a[5];”返回 的是数组元素a[5]的地址。
❖ *:指针运算符,其作用是返回以操作对象的值 作为地址的变量(或内存单元)的内容。
• C编译系统会根据定义中变量的类型,为其 分配一定字节数的内存空间(如字符型占1 个字节,整型占2字节,实型占4字节,双 精度型占8字节等),此后这个变量的地址 也就确定了。
地址的概念
计算机的内存是以字节为单位的一片连续的 存储空间,每个字节有一个编号-----地址
内存
0
程序中: int i;
…...
P
2000
2002
q
2004
2006
…...
7.4 指针与函数
➢7.4.1 “传值”与“传址” ➢7.4.2 函数返回地址
7.4.1 “传值”与“传址”
–形参为指针变量时,实参与形参之间的数据 传递
•若在定义函数时,函数的形参为指针变量,则调用 该函数时,对应的实参必须是与形参基类型相同的 地址值或已指向某个存储单元的指针变量。
2006
printf("max=%d,min=%d\n",*p1,*p2);2008

《地址和指针》PPT课件

《地址和指针》PPT课件

p 2000 2050
q 1010 2000
a5 1010

7.2.2 指针变量的基类型的作用
在C语言中,不同的数据类型变量系统为它们开辟的存储空 间的字节数是不同的。int类型的数据存储空间是2个字节, float类型的数据存储空间是4个字节, char类型的数据存储 空间是1个字节。
系统表示每一个存储空间的地址时,是取该存储空间的第1 个字节的地址作为该变量存储空间的地址。根据指针变量p 中存放的“地址”,只能寻找到变量a第1个字节的存储空间, 它并不是变量a的原值,因为变量a原值是通过2个字节来 数据。
第七章 地址和指针
主要内容 地址和指针的概念 指针变量的定义 给指针变量赋值 对指针变量的操作 指针在函数方面的应用
7.1 地址和指针的概念
7.1.1地址和指针的概念 1.“地址”的概念
在计算机里每一个存储数据的存储单元也都必须 具有一个唯一的“地址”,以示区别不同存储单 元的位置。
NULL是在stdio.h头文件中定义的预定义符,因此使用NULL时,应该在程 序的前面应加上预定义命令行:#include “stdio.h”
7.4 对指针变量的操作
7.4.1通过指针或地址引用一个存储单元 当指针变量中存放了一个确切的地址值时,通过指针可以用
“间接运算符”(*)来引用该地址所代表的存储单元。 1.在赋值号右边由“*”运算符和指针变量组成的表达式,代表
指针所指存储单元的内容。 例如:int *p,i=10,j;
p=&i;
j=*p; 2.在赋值号左边由“*”和指针变量组成的表达式,代表指针
所指的存储单元。 例如:int *p,k=0;
p=&k; *p=150; 整数150存入变量k中。

《C语言》指针--ppt课件全文

《C语言》指针--ppt课件全文

说明: 这种方法可能会破坏系统的正常
工作状态,因为temp是一个指针变量 b 59
但是在函数中并没有给temp一个确定 的地址,这样它所指向的内存单元是 不可预见的,而对*temp的赋值可能 带来危害
swap2 &a p1
&b p2 随机值 temp
5?
ppt课件
11
例 6. 3 ③ #include <stdio.h> void swap3( int *p1, int *p2) { int *p;
p
*p = 12 ; printf (“%d\n” , *p ) ;
对a 重新赋值 等价于 a=12
2. & 与*
p =ห้องสมุดไป่ตู้&a ;
1010 152 a
&*p &(*p) &a *&a *(&a) *p a
ppt课件
6
3. *与 ++ , - -
int a = 2 , b = 5 , c , d , *p ; (1) p = &a ;
② 形参表列: 即指针变量所指向的函数的形参表列 ③ 格式中的小括号不能省略 2. 应用 (1) 让指针变量指向函数 pt = add ; 因为函数名为函数的入口地址, 所以直接将函数名 赋给指针变量即可 (2) 使用指针变量调用函数 格式 : (*指针变量名) ( 实参表列)
ppt课件
17
例 求一维数组中全部元素的和
因此我们可以定义一个指针变量, 让它的值等于 函数的入口地址, 然后可以通过这个指针变量来调用 函数, 该指针变量称为指向函数的指针变量
ppt课件
16
指向函数的指针变量

C程序6

C程序6

33
34
数组与指针
一.指向数组的指针变量的定义与赋值 指向数组的指针变量的定义与赋值
由数组下标完成的操作也可由指针实现。 一数组名,就是指向此数组第0个元素的的指针 (地址), 即数组名代表数组的的首地址。 数组名代表数组的的首地址。 p=&a[0] 2 如: int a[10]; a[0] int *p; 4 a[1] p=&a[0]; 两者等价,把首地址 a 6 a[2] p=a; 给p,不是整个数 组 : 也可以: int *p=&a[0]; :
printf(“交换后 ,%d”, a,b); } 交换后%d, ” , 交换后
22
p1 p1
&a
a
→ 10
&a &aபைடு நூலகம்
a
10
b &b → 20
开始
p2
px p2
&b &b
b 20
py
函数调用开始
p1 p1
&a
a
→ 20
&a &a
a
20 10
b &b → 10
函数调用结束
p2
px p2
&b &b
b 10 20
可能会破坏系统正常的 用*t可能会破坏系统正常的工作状态。 可能会破坏系统正常 工作状态。
26
③ swap(int *px, int *py)
{ int *t ; t=px ; px=py; py=t;} main ( ) {int a=10, b=20; int *p1, *p2; p1=&a; p2=&b; printf("%d,%d\n", a,b); swap(p1,p2); printf("%d,%d", *p1,*p2);

大学计算机C语言之指针

大学计算机C语言之指针
第10章指针
10.1 地址和指针
JSU
• 变量四个基本要素
名称 地址 内容 类型
X 2002 378
• &X----变量X的地址 • 指针:一种特定的存储单元,单元内存 储的是另一个单元的地址。
江苏大学计算机学院
1
第10章指针
• 访问存储单元(变量)可以通过两种方 式实现:
JSU
– 直接访问----通过名称访问 – 间接访问----通过指针(地址)访问 变量X的地址 &X----变量X的地址(F002)
江苏大学计算机学院
JSU
Main() {int a[5]={2,3,4,5,6},i,*p; for(p=a;a<(p+5);a++) printf(―%d\n‖,*a);} Main() {int a[5]={2,3,4,5,6},i,*p=a; while(p++<(a+5) ) printf(―%d\n‖,*p);}
23
3、数组名作为函数参数(地址传递)
16
10.3 指针与数组
使用指针变量输出
JSU
Main() {int a[5]={5,6,7,8,9},i,*p=a; for(i=0;i<5;i++) printf(― %d‖,*(p+i)); printf(―\n‖);} 问题:将上面的printf(― %d‖,*(p+i))换成 printf(― %d‖,*p++)结果如何?
Void swap(int *x,int *y) {int t; t=*x;*x=*y;*y=t;} Main() {int a=3,b=8; swap(&a,&b); printf(“%d,%d\n”,a,b);}

C_C++程序设计与上机指导007

C_C++程序设计与上机指导007
1. 二维数组元素的地址 二维数组元素的地址可以由表达式&a[i][j]求得,也可以通过每行的首地址:a[0]、a[1]、a[2]等来表 示。若0≤i<3、0≤j<4,则a[i][j]的地址可以用以下五种表达式求得: • (1) &a[i][j] • (2) a[i]+j • (3) *(a+i)+j • (4) &a[0][0]+4*i+j /*在i行前有4*i个元素存在*/ • (5) a[0]+4*i+j 2. 通过地址来引用二维数组元素 以上a数组元素的值可以用以下五种表达式来引用: • (1) a[i][j] • (2) *(a[i]+j) • (3) *(*(a+i)+j) • (4) *(&a[0][0]+4*i+j) • (5) (*(a+i))[j]
• 使一个指针变量指向一个变量通常通过赋值语句来实现。设有指向整型变量的指针变 量p,如要把整型变量a 的地址赋予p可以有以下两种方式: • (1) 指针变量初始化的方法 • (2) 赋值语句的方法

指针变量的引用\ 7.1.3 指针变量的引用\
在指针变量的引用中,有两个重要的运算符: 在指针变量的引用中,有两个重要的运算符: (1)取地址运算符 取地址运算符& 取地址运算符 在调用scanf函数时及前面介绍指针变量的赋值中,我们已 函数时及前面介绍指针变量的赋值中, 在调用 函数时及前面介绍指针变量的赋值中 经了解并使用了&运算符 取地址运算符&是单目运算符 运算符。 是单目运算符, 经了解并使用了 运算符。取地址运算符 是单目运算符, 其结合性为自右至左,其功能是取变量的地址。 其结合性为自右至左,其功能是取变量的地址。 (2)取内容运算符 (2) 取内容运算符* 取内容运算符* 取内容运算符*也称间接访问运算符 是单目运算符, 也称间接访问运算符, 取内容运算符 也称间接访问运算符,是单目运算符,其结 合性为自右至左,用来表示指针变量所指的变量。 合性为自右至左,用来表示指针变量所指的变量。需要注意 的是在指针变量说明中, 的是在指针变量说明中,“*”是类型说明符,表示其后的 ”是类型说明符, 变量是指针类型;而表达式中出现的“ ” 变量是指针类型;而表达式中出现的“*”则是一个用以表 示指针变量所指变量的运算符, 示指针变量所指变量的运算符,即取指针变量所指变量的内 容。

第6章 指针

第6章 指针

地址和指针的关系
int *countPtr,count; count = 7; countPtr = &count;
例:指针运算符
#include <iostream.h> int main() { int a; // a is an integer int *aPtr; // aPtr is a pointer to an integer a = 7; aPtr = &a; cout << "The address of a is " << &a << "\nThe value of aPtr is " << aPtr; cout << "\n\nThe value of a is " << a << "\nThe value of *aPtr is " << *aPtr; cout << "\n\nShowing that * and & are inverses of " << "each other.\n&*aPtr = " << &*aPtr << "\n*&aPtr = " << *&aPtr << endl; return 0; }
i g \0
qtr
1000 1003
例6.2 字符串复制
算法分析 ①令指针指向字符串1首地址 ②将当前地址内容送字符串2
③串1地址+1 ④重复②、③直到整个字符串复制完毕为止; ⑤ 用循环语句实现,结束条件是当前值不为0。

全国计算机二级考试C语言 指针精讲

全国计算机二级考试C语言 指针精讲
变量在内存中存放是有地址的,数组在内存存放也同样
具有地址。对数组来说,数组名就是数组在内存中存放
的首地址;指针变量是用于存放变量的地址,可以指向 变量,当然也可存放数组的首地址或者数组元素的地址。
7.2.1
1。指针与一维数组
指针与数组
(1)若先定义一个一维数组,再定义一个指针变量,并将数 组的首地址传给指针变量,则该指针就指向了这个一维数组。 (2)一维数组的引用
7.1.4 指向指针的指针
1。指向指针的指针的定义形式:
类型标识符 **指针变量名 如:int **p; 即定义了一个指针变量p,且指向另一个指针变量,(该 指针变量又指向一个指针变量),是一个二级指针。 (1)由于指针运算符“*”是按至右向左的顺序结合的, 因此上述定义相当于: int *(*p); 可以看出(*p)是指针变量形式,它外面的“*‘表示p指 向的又是一个指针变量。
第2行第3列元素地址
第2行第3列元素的值 ……………
*(a+2)+3,a[2]+3,&a[2][3]
*(*(a+2)+3),*(a[2]+3), a[2][3] ……………
printf(“%d\n”,*p); }
【例2】:说出下列程序的功能。
main(0
{int *p1, *p2, i1, i2; scanf(“%d,%d”,&i1,&i2); p1=&i1; p2=&i2; printf(“%d,%d\n”,*p1,*p2);
p2=p1;
printf(“%d,%d\n”,*p1,*p2); } 运行情况:假设键盘输入为:10,20 10,20
e
e f pf

C语言程序设计——指针(完整版)PPT教学课件

C语言程序设计——指针(完整版)PPT教学课件

说明:
(1)设有指向整型变量的指针变量p,若要把整型变量a 的地址赋予p,有以下方式: 指针变量初始化的方法: int a; int *p=&a; 赋值语句的方法: int a,*p; p=&a; (2)指针运算符*和指针变量说明中的指针说明符*不是 一回事。后者表示其后的变量是指针类型,前者则是一 个运算符用以表示指针变量所指的变量。
三、 指针变量作函数参数 C语言是通过传值将参数传递给函数的,对被调函数来说, 没有直接的方法来改变主调函数内的变量的值。 例:对两个整数按大小顺序输出。 #include<stdio.h> swap(int x,int y) {int t; t=x; x=y; y=t; } void main( ) {int a=3,b=5; if(a<b) swap(a,b); printf(“a=%d,b=%d \n”,a,b); }
说明:
(1)指针变量名的构成原则是标识符,前面必须有 “*”, 表示该变量的类型是指针型变量。 (2)在一个定义语句中,可以同时定义普通变量、数组、 指针变量。 (3)类型说明符说明的数据类型不是指针变量中存放的 数据的数据类型,而是它将要指向的变量或数组的数据 类型。因此,一个指针变量只能用来指向同种数据类型 的其他变量或数组,不能时而指向一个浮点型变量,时 而指向一个整型变量。
说明:
(3)如果已执行了语句p=&a; ,则: &*p:先进行*p的运算,即是变量a,再执行&运算, 即变量a的地址。因此&*p与&a相同。 *&a:先进行&a的运算,即得a的地址,再执行*运 算, 即&a所指向的变量,即变量a。 因此*&a与a相同。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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
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
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
…...
0x12ff78 0x12ff79 0x12ff7a 0x12ff7b 0x12ff7c 0x12ff7f
5
变量px
0x12ff78
…...
指针变量
8.3 对指针变量的赋值(地址值)
(1) 指针变量的定义的同时赋初值
18 将地址值赋给指针变量 一般形式:数据类型 *指针名=初始地址值; 例 int i; int *p=&i;
当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
直接存取
6
变量实质:代表了:”内存中的某个存储单元” 7 内存的实质:以字节为单位的一片连续的存 储空间.-----每个字节都有一个编号,即” 内存地址” 内存空间是连续的,内存地址也就是连续的, 例P92 图8.1 如:short int a ,b ; float x;
1012 1013 1014
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;
关于指针使用常见错误
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 )
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
32
(3) 指针变量 - 指针变量 整数(多少个存储单元数)
q-p 1;
9 5 5 9 20 22 2002 2004
...
1的含义 ?P98
200C 200E 2010
1
第八章
地址和指针
本章内容
§变量的地址和指针 §指针变量的定义和基类型 §给指针变量赋值 §对指针变量的操作 §函数间的地址使用指针可以:
使程序简洁、紧凑、高效 有效地表示复杂的数据结构 动态分配内存 得到多于一个的函数返回值
8.1 变量地址和指针
1. 变量与地址 变量的实质是?P10地址是怎么编号的?5
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)
变量必须已说明过; 并要求两者类型一致。 例 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;
23
零指针:(空指针)
定义:指针变量值为零 例如: int * p=0;
p不指向任何内存块 24 系统保证该单元不作它用; 表示指针变量的值没有意义。
int *p=NULL;
p=NULL与未对p赋值不同 用途: 避免指针变量的非法引用 在程序中常作为状态比较

int *p; ...... while(p!=NULL) { ...… }
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出现在“=”右面表示 指针所指向存储单元的内 容;
指针变量必须先赋值(地址值),再使用!
例 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); }
变量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); } 运行结果:
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)有何不一样?
30
/*指针在使用前就先赋值*/
8.4.2 移动指针
§什么叫移动指针? 何时有意义? 指针变量+/- 一个整数; 或通过赋值使指针变量指向相邻的存储单元; 指针指向一串连续的存储单元,指针移动才有意 义.
相关文档
最新文档