第十章(指针)
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语言 ●第10章 指针-1

…
19
2.定义时同时赋值
int a[10];
int *p=a; c规定: /* 相当于int *p=&a[0] */
若有 int a[10];
int *p=a; 则 p+1:指向下一个数组元素。
…
p+i:其指向下移i个元素。
20
说明:若有 int a[10]; int *p=a; (1) p+i *(p+i) = &a[i] a[i]= a+i *(a+i) (2)数组的指针变量也可带下标 a[i] ,p[i], *(a+i),*(p+i) 是等价的。 (3)a与p的区别:a代表数组a的首地址,是常量。 p=a; p也代表数组a的首地址,是变量。 如:p++; 是正确的,而 a++; 是错误的。 (4)引用数组元素有三种方法: 下标法: a[i]或p[i] 地址法:*(a+i) 效率低 指针法:*(p+i) *p++ 效率高
13
讨论: 若将被调函数swap( )改为: swap(int *p1,int *p2) {int *p; *p=*p1; *p1=*p2; *p2=*p; /*中间变量是指针变量所指的对象*/ } p无确定的地址(地址是随机的),可能指向任何单 元,有可能破坏系统(乱放枪)。加上int c;p=&c;就没 有问题了。
3 6 9 …
i j k
2004
3010
2000
i_pointer
3
二.对内存单位的访问 存数—写 取数—读 对内存单位的访问,是通过地址进行的。 如: printf(“%d”,i); 读 再如:scanf(“%d”,&i); 写 直接访问:按变量的地址直接读写变量的值。 如:k=i+j; (1)从2000开始的内存单元中取出i的值3. (2)从2002开始的内存单元中取出j的值6. (3)相加后,送入2004开始的内存单元。 间接访问:将变量a的地址存入另一变量b中,访问a时,先 找b,取出a的地址,再按此地址访问a。
《C语言程序设计》课程教学大纲

《C语言程序设计》课程教学大纲一、课程教学目的本课程系统研究C语言的基本知识和基本语法,较好地训练学生解决问题的逻辑思维能力以及编程思路和技巧,使学生具有较强的利用C语言编写软件的能力,为培养学生有较强软件开发能力打下良好基础。
二、课程教学要求通过本课程的研究,应熟练掌握C语言中的基本知识、各种语句及程序控制结构,熟练掌握C语言的函数、数组、指针、结构体、链表等数据结构的基本算法;并能熟练地运用C语言进行结构化程序设计;具有较强的程序修改调试能力;具备较强的逻辑思维能力和独立思考能力。
三、课时分配本学科计划学时为246学时,其中理论与实训课时比例为7:3.四、课程教学重、难点课程教学重点:掌握C语言变量类型及不同类型常量的表示;标准的输入输出函数的使用;运算符及常用数学函数的使用;控制流程、数组和指针的使用;结构体、链表的构造使用;函数结构、函数参数传递及递归等方面的知识;基本的文件操作。
难点:指针的使用、结构体链表的构造和使用及函数的参数传递。
五、课程教学方法(或手段)本课程实践性较强,故采用讲授和上机操作相结合的方式进行教学。
六、课程教学内容第一章C言语概述1.教学内容(1)编程历史的回顾、程序设计介绍(过程式,面向对象,函数式,逻辑式);(2) C语言的历史背景、特点;(3) C言语源步伐的格式和步伐结构;(4) C程序的上机步骤。
2.重、难点提醒(1)重点:掌握简单的C程序格式,包括main()函数、数据说明、函数开始和结束标志等;(2)难点:编程入门和对言语的理解。
第二章算法1.教学内容(1)算法的概念及特征;评价算法优劣的方法(时间和空间);(2)简单算法举例;(3)算法的表示(自然语言、流程图、N-S流程图);(4)结构化步伐设计的基本思想及基本步调。
2.重、难点提醒(1)重点:算法流程图三种基本结构(以后各章研究中使用流程图强化对步伐的理解);(2)难点:算法概念和对结构化步伐设计思想的理解。
Fortran指针

二、插入和删除
插入:
删除:
不过编写interface很麻烦,将函数封装在module中,就等于 编写好interface
10.4
指针的应用
在两条数据进行交换,尤其是这两条数据量很大的时 候,这时用指针可以提高执行效率,而且需要的空间 小 一· 指针还可以创建各种串行结构,以及树状结构 串行结构:
1:单向串行
双向串行:
环状串行:
第十章 指针
实质:给一个变量起一个别名
10.1 指针的基本概念 指针变量的定义格式
类型说明, POINTER::指针变量名1, 指针变量名2, …
类型说明,它表示该指针所指的目标变量类型。
指针的使用: 格式:指针变量=>目标变量或者另一指针变量。
注意:指针变量与目标变量的类型应当一致
10.2 指针数组
指针也可以声明成数组来进行使用
这里有两个使用方法: 1:让指针指到其他数组 2:配置一个内存空间来使用
第一种情况: Example: Integer , pointer :: a(:) Integer , target :: b(5)=(∕1,2,3,4,5∕) a=>b ! a(1~5)=>b(1~5)
第二种情况: 动态分配存储单元函数:ALLOCATE
方法:先定义指针,再利用ALLOCATE(P)函数为其动 态分配空间,其中P为指针变量。
优点:通过动态定义,可以根据当时使用 空间大小来生成空间,使数组大小满足 要求。
注意: 释放存储单元函数:DEALLOCATE
10.3 指针与函数
指针变量可以作为参数在函数之间传递,也可 以作为函数的返回值 使用时需要注意以下几点策略: 1:要把指针传递给函数时,要声明这个函数的参数 使用接口interface. 2 指针参数声明时不需要intent这个形容词。 3函数返回值若为指针时,需要定义函数的interface.
c语言第10章指针

3.间接引用指针
间接引用指针时,可获得由该指针变量所指向的变量内容。
例如,int i=10,*ip=&i;
ip
i
cout<<*ip<<endl;
0000:F384 0000:F384 210
运行结果为:10 即指针ip所指向的变量i的内容。
*放在定义过的指针变量之前,称为间接引用操作符; *放在指针变量定义中时,称为指针定义符。 非指针变量不能用间接引用操作符,*只能作用于地址。
例如, double d=1.23,*dp; char c,*cp;
在&和cp*=作&d用; 下,对变量d和dp有如下6种操作: 其d,中d,dpp,=*&d*是cd; ,非*法dp的,;&&d指,dp针&是只d指p能。针指的向地与址其即同二类级型指的针量。 另外,指针除了可指向所有基本类型的变量外,指针也可 指向常量、数组、数组元素、函数、指针以及文件等。
int ii=n1t0;b, a[10]; int *inpt=&*pi;1,//*初p2始; 化为整型变量的地址,但 *ip=p&1=i;&//是b;错误的
注意:p2不=p要1将; “//可in以t *将ip=一&个i;”已与赋“值*i的p=指&i针;”混赋淆给。另一个相同类型的指针 前者是p2定=&义a语[5句];,*是指针定义符,系统为指针变量ip分配一个空间, 并2、用i数的地组址的值地初址始值化;可后用者该是数执组行语的句数,组左名右表两边示类。型例不如匹:配。 指 例3、针如变,ip函n=d*d量t数bodob;up在u的b=b[3使ll6ee].地8[用*d;4d=址]前/p2,/!(;.,*5值;p一)由[定4该]要; 函被数$赋$$以的d$:p一$名$个$字$地来址表值$$$,示$:否$。$$则$例是如很#6某#:危.#8变险量的。 没有被do赋ub值le的s指in针(d变ou量bdlep的x值);是一个随机地址,把6.8赋给内存中的 随机位do置ub,le很(可*p能f)破( 坏); 了另一个变量,甚至修改了栈中的函数返回 地址,pf造=s成in计; 算机死机或进入死循环。
第十章 指针(含答案)

第十章指针一、选择题1.以下程序的运行结果是【C】。
sub(int x,int y,int *z){*z=y-x ;}main(){ int a, b,c;sub(10,5,&a);sub(7,a,&b);sub(a,b,&c);printf(”%4d,%4d,%4d\n”,a,b,c);}A. 5,2,3 B. -5,-12,-7 C.-5,-12,-17 D. 5,-2,-72.若已定义 char s[10]; 则在下面表达式中不表示s[1]的地址的是【 B 】A)s+1 B)s++ C)&s[0]+1 D)&s[1]3.下列程序能对两个整型变量的值进行交换。
以下正确的说法是【 D】。
main(){ int a=10,b=20;printf("(1)a=%d,b=%d\n",a,b);swap(&a,&b);printf(“(2)a=%d,b=%d\n”a,b);}swap(int p, int q){ int t; t=p;p=q;q=t;}A. 该程序完全正确B. 该程序有错,只要将语句swap(&a,&b);中的参数改为a,b即可C. 该程序有错,只要将swap()函数中的形参p和q以及t均定义为指针(执行语句不变)即可D. 以上说法都不正确4.有四组对指针变量进行操作的语句,以下判断正确的选项是【】。
(1)int *p,*q; q=p;int a,*p,*q;p=q=&a;(2)int a,*p,*q; q=&a; p=*q;int a=20, *p; *p=a;(3)int a=b=0,* p; p=&a; b=* p;int a=20,*p,*q=&a; *p=*q;(4)int a=20,*p,*q=&a; p=q;int p, *q; q=&p;A.正确:(1);不正确:(2),(3),(4)B.正确:(l),(4);不正确:(2),(3)C.正确:(3);不正确:(1),(2),(4)D.以上结论都不正确5.以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是【】。
指针

The C Programming Language
Chapter 10 Pointers
10.2 变量的指针和指向变量的指针变量
• 指针:一个变量的地址 • 指针变量:专门存放变量地址的变量叫指针变量
指针 2000 …... 整型变量i
变量的地址
2001 2002 2003 2004 2005
10
main() { int *p1,*p2,*p,a,b; 2000 scanf("%d,%d",&a,&b); 2002 p1=&a; p2=&b; 2004 if(a<b) 2006 { p=p1; p1=p2; p2=p;} 2008 printf("a=%d,b=%d\n",a,b); printf("max=%d,min=%d\n",*p1,*p2); }
– 指针变量的定义
• 一般形式: [存储类型] 基类型 *指针名; 例 int *p1,*p2; float *q ; 表示定义指针变量,起类型说明的作用 合法标识符 指针变量本身的存储类型 指针的目标变量的数据类型 static char *name; 不是‘*’运算符 注意: 1、int *p1, *p2; 与 int *p1, p2;的区别 2、指针变量名是p1,p2 ,不是*p1,*p2 3、指针变量只能指向定义时所规定类型的变量 4、指针变量定义后,变量值不确定,应用前必须先赋值
整型变量i 整型变量k
10
10
变量i_pointer 指针变量
The C Programming Language
Chapter 10 Pointers
指针变量与其所指向的变量之间的关系
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.补充程序,程序实现从10个数中找出最大值和最小值。
#include <stdio.h>
#include <stdlib.h>
int max,min;
void find_max_min(int *p,int n)
{
int *q;
max=min=*p;
for(q=p; q</**/ p+n /**/; q++)
if(/**/ max<*q /**/ ) max=*q;
else if(min>*q) min=*q;
}
void main()
{
int i,num[10];
printf("Input 10 numbers: ");
for(i=0;i<10;i++) scanf("%d",&num[i]);
find_max_min(/**/ num /**/,10);
printf("max=%d,num=%d\n",max,min);
}
2.补充程序,其中main函数通过调用average函数计算数组元素的平均值。
#include <stdio.h>
float average(int *pa,int n)
{
int k;
/**/ float avg=0; /**/
for(k=0;k<n;k++)
avg = avg+/**/ *(pa+k) /**/;
avg = avg/n;
return avg;
}
void main()
{ int a[5]={20,30,45,64,23};
float m;
m=average(/**/ a /**/, 5);
printf("Average=%f\n",m);
}
3.程序功能是将程序中的两个字符串”ABC”、”xyz”连接在一起,并输出:ABCxyz。
#include <stdio.h>
#include <string.h>
void main()
{
char s1[12]="ABC", s2[]="xyz";
char * ps1=s1,*ps2;
/**/ ps2 = NULL;ps2=s2; /**/
/**/ while(*ps1 == NULL)while(*ps1!=’\0’) /**/
ps1++;
while(*ps2) *(ps1++) = *(ps2++);
printf("%s\n",s1);
getch();
}
4.打开程序Cprog032.c,完成其中的函数fun(char *s ),使程序实现统计输入字符串中空格的个数。
#include <stdio.h>
int fun(char *s)
{ /**/
int count=0;
while(*s)
{count++;
s++;
}
return count;
/**/
}
void main()
{
char str[255];
gets(str);
printf("%d\n",fun(str));
}
5. 将程序填写完整,使其中函数void tru(char *s),实现将字符串中所有奇数位置上(注:本题将字符串的首字符称为第一位)的小写英文字母转换为大写英文字母(若不是英文字母则不转换)。
例如:原字符串ssdax31 被转换成SsDaX31
#include <stdio.h>
#include <conio.h>
void trn(char *s)
{
int i=1,n=0;
char *p=s;
while(*p)
{
if(/**/ (i%2!=0) && (*p>='a' && *p<='z' ) /**/ ) *p=*p-32;
/**/ p++; /**/
i++;
}
}
void main()
{
char ss[100];
printf("Input string: \n");
gets(ss);
trn(ss);
printf("\nNow string is :\n");
puts(ss);
getch();
}。