讲授提纲第六章_指针(1)

合集下载

6-1 指针

6-1 指针

变量名
变量 值
地址2000
3
3
地址2000“指向”变量 i
变量的指针和指向变量的指针变量

变量的指针:变量的地址

指针变量:用来存放地址的变量。
i_pointer i
2000
3
2000是 “变量的指针”
将地址2000存放在变量i_pointer中
i_pointer称为“指针变量”
二、指针变量的定义
输出:0 1 2 3 4
指针位移运算
(1)指针变量的值可以改变,即可以使用p++、p+=2、p-=3等, 作用是相对于当前位置前移或后移若干个存储单元。
数组名本身表示数组的首地址,是常量而不是变量,故不能 对数组名进行自增自减或赋值运算。 (2)注意下面几种运算: *p++与*(p++)等价 (*与++同优先等级,右结合性) *(p++)与*(++p)不等价 (前者访问当前,后者访问下一个) (*p)++与*(p++)不等价 (前者表示访问后加1,后者表示指 针加1)
如果执行如下表达式: *p2=*p1; 则表示把p1指向的 内容赋给p2所指的 区域, 此时就变成图 所示
例.
main( ) {float a,b,*p,*q,*t; q p=&a;q=&b; &b a=12.8; b=-6.1; a,b没有交换 两个指针交换 t=p; p=q; q=t; printf ( ”(1) %f,%f\n” ,a,b ) ; printf ( ”(2) %f,%f\n” ,*p,*q ) ; } 结果:(1) 12.8,-6.1

第六章指针

第六章指针
1 2 3 4 5 int a[10], *p; p = a; // p = &a[0]; printf("%d %d %d\n",sizeof a,sizeof p,sizeof(&a[0])); scanf("%d", a); //scanf("%d", &a[0]);scanf("%d", p); *a = 7; //即 a[0]=7 //输出结果 40 4 4
13 / 26
指针运算的示例
printf 的转换说明%p 用来输出指针值 (通常不关心) 关心指针的所指对象及相对位置 int a[10]= {1,2,3,4},*p=&a[2],*q=&a[9]; if(p<q) printf("p is less than q\n"); printf("%p %p %p %d\n",&a[0],p,q,p−q); p++; −−q; //p−>a[3] q−>a[8] printf("%p %p %d %d\n",p, q, *p,*(q−6)); 输出如下 p is less than q 0012FF58 0012FF60 0012FF7C −7 0012FF64 0012FF78 4 3
18 / 26
求班级平均成绩
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include <stdio.h> float average(float *score, int number) { //score−数组首址 num−传递数组大小 int i; float sum; for(i = 0, sum = 0; i < number; ++i) sum += score[i]; return sum / number; } int main(void){ float score[ ] = { 56, 78, 95, 44}; int number = sizeof(score)/sizeof(score[0]); printf("%.2f\n", average(score, number) ); return 0; }

精通C程序设计第六章指针初步课件

精通C程序设计第六章指针初步课件

Ch6-15
6.1指针的概念与基本操作 续14) 指针的概念与基本操作(续 指针的概念与基本操作
特殊表达式: 特殊表达式: (a) ∗p++; 和 ∗p--; 先取用对象,然后p自加减1 (b) ++∗p;⇔ ∗++p; --∗p; ⇔ ∗--p; 这四种形式都是p先自加减1,然后再取用对象 对比:++(∗p); (∗p)++; --(∗p); (∗p)--; 对比 这是对象自加减1
Ch6-8
6.1指针的概念与基本操作 续7) 指针的概念与基本操作(续 指针的概念与基本操作
2.取对象运算 ∗指针表达式 取对象运算: 取对象运算 例1:int a=123, ∗p; p=&a; printf("%d", ∗p); //则打印结果为 则打印结果为123,即变量 的值 则打印结果为 ,即变量a的值 例2:int a=0x4241; char ∗p; : p=(char ∗)&a; putchar(∗p); //则打印结果为 则打印结果为A 则打印结果为 理解帮助理解帮助-指针、指针变量与指针对象的关系
Ch6-3
6.1 指针的概念与基本操作 续2) 指针的概念与基本操作(续
(3) 对象属性 对象属性: 指该地址开始(指针指向 指针指向)的内存单元中存放的 指针指向 数据。定义指针变量时,必须指定指针变量的对象 类型。我们使用指针的主要目的就是通过指针访问 内存中的数据。 如: double ∗p; void ∗p; //指针 的对象是一个 指针p的对象是一个 指针 的对象是一个double型数据 型数据 //指针 指向一个 指针p指向一个 指针 指向一个double型数据 型数据 //指针 指向 指针p指向 指针 指向nothing //无值指针不能进行运算和存取操作 无值指针不能进行运算和存取操作

f第六章 指针

f第六章 指针

第六章指针6.1 指针的基本概念6.1.1 地址与指针一、地址地址的概念计算机的内存被划分成一个个存储单元,为了区分各存储单元,要为每个存储单元编号,这个编号即地址.变量的地址与变量的内容例如: i=3;j=6.0;二、指针变量的指针即变量的地址。

指针变量即存放地址的变量。

例如:地址2000 是变量i的指针i_pointer是指针变量,其值为地址20006.1.2 指针变量的定义与引用一、指针变量的定义一般形式:类型*指针变量名1,*指针变量名2,…;例如:int *p;float *q;二、指针变量的赋值1. 通过&获得地址值int a=5,*pa;pa=&a;2. 通过指针变量获得地址值int a,*pa=&a,*pb;pb=pa;3. 数组首地址赋予指针变量int a[3],*pa;pa=a;4. 给指针变量赋空值具有NULL值的指针变量称为空指针。

例如:int *p=0;或int *p=NULL;三、指针变量的引用两个运算符:(1)取地址运算符&功能:取变量的地址;单目,右结合(2)取内容运算符*功能:取指针变量所指向单元的内容;单目,右结合该运算符后只能跟指针变量如:int a=5, *p=&a;printf(“%d”, *p);例: 输入a和b两个整数,按先大后小的顺序输出a和b。

main(){int *p1,*p2,a,b,t;scanf("%d,%d",&a,&b);p1=&a; p2=&b;if (*p1<*p2){t=*p1;*p1=*p2;*p2=t;}printf("a=%d,b=%d\n",a,b);printf("max=%d,min=%d\n",*p1,*p2);}输入:5,9↙输出:a=9,b=5max=9,min=5对上例程序中的if子句作修改,使程序变为:void main(){int *p1,*p2,*p,a,b;scanf("%d,%d",&a,&b);p1=&a; p2=&b;if (*p1<*p2){p=p1;p1=p2;p2=p;}printf("a=%d,b=%d\n",a,b);printf("max=%d,min=%d\n",*p1,*p2);}输入:5,9↙输出:a=5,b=9max=9,min=56.1.3 指针变量的运算一、算术运算指针仅能进行加、减算术运算如:p+n p-n p+ + p--+ +p --p p-= n p+=n p1-p2等其中n是整数,p、p1、p2均为指针;施行加法运算时,指针向地址增大的方向移动;减法运算时,指针向地址减小的方向移动;移动长度取决于指针的基类型,由计算机决定。

VC++讲义第06单元 指针

VC++讲义第06单元 指针

第6单元指针本单元教学目标介绍C++中指针的基本概念。

学习要求指针是C++中最重要的基本概念之一。

要求同学们充分理解和掌握:1.什么是地址? 什么是指针?2.指针类型变量的声明方法和怎样将一个变量或数组的地址赋给指针类型的变量;3.怎样通过指针类型的变量去访问某个变量或数组元素的值。

授课内容6.1 地址与指针我们知道, 从拓扑结构上来说, 计算机的内存储器就象一个巨大的一维数组, 每个数组元素就是一个存储单元(在微型计算机中其大小通常为一个字节)。

就象数组中的每个元素都有一个下标一样, 每个内存单元都有一个编号, 又称地址。

内存储器是程序活动的基本舞台。

在运行一个程序时, 程序本身及其所用到的数据都要放在内存储器中:程序、函数、变量、常数、数组和对象等, 无不在内存储器中占有一席之地。

凡是存放在内存储器中的程序和数据都有一个地址, 用它们占用的那片存储单元中的第一个存储单元的地址表示。

在C++中,为某个变量或者函数分配存储器的工作由编译程序完成1。

在编写程序时, 通常是通过名字来使用一个变量或者调用某个函数。

这样做既直观, 又方便。

而变量和函数的名字与其实际存储地址之间的变换由编译程序自动完成。

但是, C++也允许直接通过地址处理数据, 在很多情况下这样做可以提高程序的运行效率。

那么怎样才能知道某个变量、数组或者函数的地址呢?C++规定:(1) 变量的地址可以使用地址运算符&求得。

例如, &x表示变量x的地址;1实际上, 为变量和函数分配存储的工作是分几步完成的。

在编译和连接的过程中, 只给程序中的各个变量分配了相对地址。

每个变量的实际存储位置要到程序运行时才能确定。

如果是局部变量, 其存储分配更晚, 要到该局部变量所属的函数被调用时才进行。

因此, 同一个变量, 在程序的各次运行中可能被分配在不同的存储地址上。

这也是为什么通常只需要知道某变量确有一个地址, 而不必关心该地址值具体是多少的原因。

《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
指向函数的指针变量

第6章-指针和引用

第6章-指针和引用

6.3 指针与数组 6.3.1 指针作为函数参数
各种类型的指针都可以作为函数的参数,具有两个有点: 各种类型的指针都可以作为函数的参数,具有两个有点: 节省时间和空间,提高效率; 节省时间和空间,提高效率;在被调用的函数中改变参数值 6.10】编程验证主函数参数argv argv是用来存放命令行参数的内容的 【例6.10】编程验证主函数参数argv是用来存放命令行参数的内容的 #include<iostream.h> void main(int argc,char *argv[]) { for(int i=1;i<argc;i++) cout<<*(argv+i)<<‘’; cout<<endl; }
6.2 指针与数组 6.2.1 数组名是一个常量指针
规定数组名是一个常量指针, 规定数组名是一个常量指针,一个数组的数组名便是这个数组的首元 素的地址 6.2.2 数组元素的指针表示 1.一维数组元素的指针表示 1.一维数组元素的指针表示 假定a是一个一维数组, 假定a是一个一维数组,格式为 int a[10] 该数组元素的下标表示为 a[i] 该数组元素的指针表示为 *(a+i)
2. 字符指针 字符指针式用来指向字符串的指针, 字符指针式用来指向字符串的指针,使用字符指针可以方便的对 字符串进行处理
【例6.6】使用字符指针编程,将一个字符串每个字符加一后生成一个新字符串 6.6】使用字符指针编程, 再将它还原为原字符串 #include<iostream.h> void main() { char *p1,a[16],b[16]; p1=“I am a teacher:”; for(int i=0;i<15;i++) a[i]=*p1+++1; a[i]=‘\ a[i]=‘\0’; cout<<a<<endl; for(int i=0;i<15;i++) b[i]=*(a+i)b[i]=*(a+i)-1; b[i]=‘\ b[i]=‘\0’; cout<<b<<endl; } 程序输出如下: 程序输出如下: J!bu!b!ufbdifs/ I am a teacher:

第6章_指针

第6章_指针

}
23
函数返回指针
定义形式 类型说明符 *函数名(参数表) { 函数体 } 例如:int *search( int *x , int n) { int *p; p=x+n; return(p); } 函数的返回值为指向整型的指针。
27
例:输出两整数中的大者
#include <stdio.h> int *max( int * p1,int * p2) { int *r; if(*p1> *p2) r = p1; else r = p2; return r; } void main() { int a,b; int *p; printf("输入a和b:\n"); scanf("%d,%d",&a,&b); p = max( &a , &b ); printf("max = %d\n",*p); }

42
引用数组元素的方法
例如:int a[8],i; int *p=a; 下标法: 用a[i]来引用数组a的第i个数组元素。也可用p[i]。 指针法: 用*(a+i),*(p+i)引用数组的第i个数组元素。
按C的规定:如果指针变量p已指向数组中的一个元素,则p+1 指向同一数组中的下一个元素(而不是将p值简单加1).
3
6.1 变量的地址和指针
数据在内存中的存储 访问变量的方式 指针变量
4
数据在内存中的存储
在程序中所定义的变量,编译时系统会根据 变量的类型,分配一定长度的存储空间。内存中 每一个存储单元的有唯一编号(地址)。 如:在Turbo C 中 2000 int a 2个字节 a 6 float b 4个字节 2002 b
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第六章指针§6.1指针与指针变量一、指针与指针变量[例6.1] 变量、单元、地址与指针。

int x = 27; 1000 char ch = ’0’;float y = 15.6; 1002 int z = -50; 1003 int *px = &x; float *py = &y;100710091011二、指针变量定义[例6-2] 定义指向int ,float ,char ,型的指针变量。

int *p1,*p2; float *p3; char *p6,*p7;[例6-3] 标识符p1~p4的含义是什么?[规定] 说明函数的标志()、说明数组的标志[]优先于说明指针的标志*进行结合,若想改变结合性,可以引入括弧( )。

int *p1 ; ① p1是一个指针变量。

① ② p1指向整型单元。

② ③ 图示:某个 int 型单元char (*p2)[5] ;① p2是一个指针变量。

① ② p2 指向一个含有5个元素的数组。

(即p2是数组指针) ② ③ 该数组是字符数组 ③ ④ 图示: p25个元素的字符数组char * p3 [5] ;① p3是数组,含有5个元素。

①② p3数组是指针型数组,即p3数组每一元素均是指针。

②③ p3数组中的每一指针都是指向字符单元的指针。

③④图示:int **p4 ; ① p4是指针变量。

①② p4指向一个指针变量。

②③ p4所指向的指针变量指向字符单元。

③④图示:指向字符的某个指针变量变量[要点]①记住上述指针定义形式,它们是固定形式。

②必须理解指针对象,它贯穿于所有指针操作中。

③学会画指针示意图,如能正确画出指针图示,将对指针的所有问题及概念理解有所帮助。

三、指针运算1.取地址运算符 &[基本形式] &变量名[含义] 取得变量的内存单元地址。

2.取内容运算符 *[基本形式] *指针变量[含义] 取得指针变量所指向单元的内容。

[例] ①int x ,*px,y;② px = &x ;③ x=15;④y=*px ;3.指针加/减运算指针加/减的含义可以理解为“指向下一单元”。

[例6-4]指针+/-概念。

#include "stdio.h"main(){ /* ① */ int x[5] = { 1, 3, 5, 7, 9 }, *px;/* ② */ float y[3] = { 2.0, 4.0, 8.0 }, *py;/* ③ */ px=&x[0]; py=&y[0];/* ④ */ printf("A: px=%u py=%u *px=%d *py=%f\n", px,py,*px,*py); /* ⑤ */ px=px+1; py=py+1;/* ⑥ */ printf("B: px=%u py=%u *px=%d *py=%f\n", px,py,*px,*py); /* ⑦ */ printf("C: px+3=%u py+2=%u\n", px+3,py+2);}4.指针比较§6.2 用指针处理变量[例6-5] 将a,b变量中的值按从小到大的顺序排序输出。

[程序1] 用传统的“按名存取”去实现。

设输入19 15。

main(){ int a,b,t;scanf("%d %d", &a, &b);if ( a>b ) { t=a; a=b; b=t; }printf("%d %d\n",a,b);}[程序2] 用指针实现对变量的交换。

假设输入19,15。

main() {int a,b,t,*pa,*pb;① pa=&a; pb=&b;② scanf("%d %d", pa, pb);if ( *pa > *pb ) { ③ t=*pa; *pa=*pb; *pb=t; }printf("%d %d\n",*pa,*pb);}[程序3] 采用交换指针方法而不交换a , b变量的值。

main() {int a,b,*pa=&a,*pb=&b,*p;scanf("%d %d", pa, pb);if ( *pa > *pb ) { p=pa; pa=pb; pb=p; }printf("%d %d\n",*pa,*pb);}[例6-26]如下程序执行后的输出结果是什么?#include "stdio.h"main() {int a, b, k=2, m=4, n=6;int *p1=&k, *p2=&m, *p3;a = p1!=p2;b = 4*(-*p1)/(*p2)+5;*(p3=&n) = *p1*(*p2);printf("a=%d b=%d n=%d\n", a,b,n);}§6.3 用指针处理一维数组一、数组的指针表示1.数组名是数组的起始地址。

2.数组(基)指针3.数组基指针与数组名的差别二、通过指针存取数组元素1.下标法设int a[10],*p=a;/* p是a数组的基指针 */①a[i] 含义:a数组第i个元素。

&a[i] 含义:a数组第i个元素的地址。

②p[i] 含义:以p为基地址的数组第i个元素。

&p[i] 含义:以p为基地址的数组第i个元素的地址。

[例6-6a] 在数组中查找元素。

具体要求是输入10个整数存入一维数组a,再输入一个待查的整数存入x,程序在数组a中查找x的首次出现位置c(即下标值)并打印出来,如查不到打印Not found!。

main() {int a[10],*p,f,i,x;for (i=0; i<10; i++) scanf("%d", &a[i]);scanf("%d", &x);for (f=0, p=a,i=0; i<10; i++)if (p[i]==x) {f=1; break;}if (f) printf("Found: %d\n", i+1); else printf("Not found!\n");}2.“(数组基)指针+偏移”方式设int a[10], *p=a;①a+i 这种形式的含义是:a数组第i个元素的地址。

*(a+i) 这种形式的含义是:地址为a+i的单元内容。

即a[i]。

②p+i 这种形式的含义是:以p为基地址的数组第i个元素地址。

*(p+i) 这种形式的含义是:以p为基地址的数组第i个元素内容。

a+i ⇔&a[i] *(a+i) ⇔a[i]p+i ⇔&p[i] *(p+i) ⇔p[i][例6-6b]问题同例6-6a,在数组中查找元素。

main() {int a[10],*p,f,i,x;for (i=0; i<10; i++) scanf("%d", a+i);scanf("%d", &x);for (f=0, p=a,i=0; i<10; i++)if ( *(p+i)==x ) {f=1; break;}if (f) printf("Found: %d\n", i+1); else printf("Not found!\n");}3.元素指针法[例6-6c]问题同例6-6a,在数组中查找元素。

main() {int a[10],*p,f,n,i,x;for (i=0; i<10; i++) scanf("%d", a+i);scanf("%d", &x);for (n=0,f=0, p=a; p < a+10; p++ ) {n++; if ( *p == x ) {f=1; break;}}if (f) printf("Found: %d\n", n); else printf("Not found!\n");}p只起元素指针作用,循环控制仍由循环次数计时器i来控制。

main() {int a[10],*p,f,n,i,x;for (i=0; i<10; i++) scanf("%d", a+i);scanf("%d", &x);for (n=0, f=0, p=a, i=0; i<10; p++,i++ ) {n++; if ( *p == x ) {f=1; break;}}if (f) printf("Found: %d\n", n); else printf("Not found!\n");}4.三种表示数组元素方式的差别[例6-7] 对于整型数组a[10]和b[10]做如下处理:将偶位置的对应元素相加送入整型数组c[5];将奇位置对应元素相加送入整型数组d[5]。

请填空。

a[0]+b[0] → c[0] a[1]+b[1] → d[0]a[2]+b[2] → c[1] a[3]+b[3] → d[1]…………a[8]+b[8] → c[4] a[9]+b[9] → d[4]main() {int a[10], b[10], c[5], d[5];int *pa, *pb, *pc, *pd, i;for ( i=0; i<10; i++ ) scanf("%d", ① );for ( i=0; i<10; i++ ) scanf("%d", ② );for ( pa=a,pc=c,i=0; i<10; i+=2, ③ )*pc = *( ④ ) + *( ⑤ );for ( pa=a+1,pb=b+1,pd=d; pd< ⑥ ; ⑦ , ⑧ , pd++)*pd = (*pa) + (*pb);for ( i=0; i<5; i++ ) printf("%d ", c[i] );printf("\n");for ( i=0; i<5; i++ ) printf("%d ", d[i] );printf("\n"); }[答案] ① a+i 或 &a[i] ② b+i 或 &b[i] ③ pc++④ pa+i 或a+i ⑤ b+i (④⑤可互换)⑥ d+5⑦ pa+=2 pa=pa+2 ⑧ pb+=2 pb=pb+2 (⑦⑧可互换)5.关于指针变量的一些复杂描述设int *p, k;① *p++[含义] 先取p所指对象的内容,再使p++指向下一元素。

相关文档
最新文档