当前位置:文档之家› C语言程序设计教案 第十章指针

C语言程序设计教案 第十章指针

第十章指针

课题:第十章指针§1-§2

教学目的:1、了解指针与地址的概念

2、掌握指针变量的定义、初始化及指针的运算

教学重点:教学难点:指针变量的定义、初始化及指针的运算指针的运算

步骤一复习引导

指针是C语言的一个重要概念,也是C语言的一个重要特色。正确而灵活地运用它,可以有效地表示复杂的数据结构;能动态分配内存;能方便地使用字符串;有效而方便地使用数组;在调用函数时能得到多于1个的值;能直接处理内存地址等,这对设计系统软件是很必要的。

指针的概念比较复杂,使用也比较灵活,因此初学者时常会出错,务请在学习本章内容时十分小心。

步骤二讲授新课

§10.1 地址和指针的概念

计算机的主存储器被分成一个个存储单元,为了区分各存储单元,要为每个存储单元编号,这个编号即地址。

例:i =3; 或scanf(“%d”, &i);

是将3送给i所在的空间。

例:将3送到变量I_pointer所“指向”的单元(即I所标志的单元)。

所谓“指向”,是通过地址来体现的,I_pointer中的值为2000,它是变量I 的地址,这样就在I_pointer和变量之间建立起一种联系,即通过I_pointer能知道I的地址,从而找到变量I 的内存单元。因而在C语言中,将地址形象化地称为“指针”。

意思是通过它能找到以它为地址的内存单元。一个变量的地址称为该变量的“指针”。

内存单元的地址和内存单元的内容是两个不同的概念。

指针:就是地址,即内存单元的编号。

指针变量:用来存放另一变量的地址(即指针)的变量。

如:地址2000是变量i的指针;i_pointer是指针变量,其值就是指针2000。

§10.2变量的指针和指向变量的指针变量

变量的指针就是变量的地址。

存放变量地址的变量是指针变量,用来指向另一个变量。

*i_pointer 表示i_pointer 所指向的变量。

一、定义一个指针变量

指针变量的定义包含三个方面的内容:

⑴指针类型说明,即定义变量为一个指针变量

⑵指针变量名

⑶变量值(指针)所指向的变量的数据类型。

格式:存储类型基类型*指针变量名;

例:int *pointer_1, *pointer_2;

float *pointer_3;

char *pointer_4;

二、指针的引用

指针变量有两个运算符:

& :取地址运算符

功能:取变量地址;单目,右结合。

* :取内容运算符(“间接访问”运算符)

功能:只能跟地址,取变量所指向单元的内容;单目,右结合。

例:&a为变量a的地址,

*p 为指针变量p所指向的存储单元。

例:int a=5, *p=&a;

printf ( “%d”, *p );

main()

{ int a,b;

int *pointer_1,*pointer_2;

a=100;b=10;

pointer_1=&a; /*把变量a的地址赋给pointer_1*/

pointer_2=&b; /*把变量b的地址赋给pointer_2*/

printf(“%d,%d\n”,a,b);

printf(“%d,%d\n”,*pointer_1, *pointer_2);

}

输出结果:100, 10

100, 10

评注:

1、在第3行虽然定义了两个指针变量,只是提供了两个指针变量,但并未指向任何一个整型变量。称为指针“悬空”。

2、最后一行的*pointer_1和pointer_2就是变量a和b。

3、程序中两处出现*pointer_1等,含义不同。程序第3行中的*pointer_1表示定义指针变量pointer_1。它前面的*只是表示该变量是指针变量。程序最后一行中的*pointer_1则代表变量,即pointer_1所指向的变量。

4、第5行中的pointer_1=&a 是将a的地址赋给指针变量pointer_1,而不是*pointer_1。

注意:不应写成:*pointer_1=&a;

5、从上例中可看出,*pointer_1等价于a,*pointer_2等价于b,故凡在程序中出现a的地方均可用*pointer_1 代替。所以,若有:int x, y, *px=&x ;

则下面的运算均是正确的:y=*px+1; /*把x 的内容加1 送变量y*/

printf(“%d\n”, px ); /*打印当前x 的内容*/

d=sqrt((double) px); /*把x的平方根送变量d*/

px=0; /*把x 置为0*/

*px+=1; /*把x 的值加1*/

(*px)++; /*使x 的值加1*/

y=(*px)++; /*即y=x, x++*/

6、假设px和py都被定义为指向int 对象的指针,而且px当前已指向了int 型变量x,则执行:

py=px; /*把指针px的内容拷贝到指针py中去*/

即py和px 这两个不同的指针指向了同一对象x

7、指针不是整数,不能将它与整数混为一谈。

例:

# include

main()

{ int x=100,*p;

p=x;

printf(“%d”, p );

}

例如:

# include

main()

{ int a, b, *d=&a;

b = d;

printf( “%d \n”, b );

……

}——编译不出错,但得不到希望的值

关于&和*运算符的说明:

假设已执行pointer_1=&a;

1、&*pointer_1含义是什么?

&*pointer_1与&a相同,即变量a的地址。

2、*&a的含义是什么?

先进行&a运算,得a的地址,再进行*运算。

*&a、*pointer_1及变量a等价。

3、(*pointer_1) + + 相当于a + +。

它与*pointer_1 + + 不同。

4、*pointer_1 + + 等价于*(pointer_1 + +),即先进行*运算,得到a的值,然后使pointer_1的值改变,这样pointer_1不再指向a了。

例10.2:输入a和b两个整数,按先大后小的顺序输出a和b。

main()

{ int *p1,*p2,*p, a, b;

scanf(“%d,%d”,&a,&b);

p1=&a; p2=&b;

if (a

{p=p1; p1=p2; p2=p;}

printf(“\n a=%d,b=%d\n”,a,b);

printf(“max=%d,min=%d\n”,*p1,*p2);

}

运行情况:

5,9

a=5,b=9

max=9,min=5

三、指针变量作为函数参数

例10.3对输入的两个整数按大小顺序输出。

先考察如下程序,看是否能得到预期的结果

swap(int p1, int p2)

{ int temp;

temp = p1;

p1 = p2;

p2 =temp;

}

main()

{ int a, b;

scanf(“%d, %d”, &a, &b);

if(a

printf(“\n%d,%d\n”,a,b);

}

不能得到预期的结果。

改为:

swap(int *p1,int *p2)

{ int temp;

temp = *p1;

*p1 = *p2;

*p2 =temp;

}

main()

{ int a,b;

int *pointer_1,*pointer_2;

scanf(“%d,%d”,&a,&b);

pointer_1=&a;

pointer_2=&b;

if(a

print f(“\n%d,%d\n”,a,b);

}

注:如果想通过函数调用得到n个改变的值,可以:

1、在主调函数中设n 个变量,用n个指针变量指向它们;

2、然后将指针变量作实参,将这n 个变量的地址传给所调用的函数的形参;

3、通过形参指针变量,改变该n个变量的值;

4、主调函数中就可以使用这些改变了值的变量。

四、指针(变量)的初始化

指针置初始化值的格式:

存储类型基类型*指针名=初始化值;

如:main()

{ static int a;

int *p=&a, *p1=p;

…… }

再如:int *p = 0;

或int *p = NULL;

五、指针的运算

1、指针的算术运算

指针仅能进行加、减算术运算

如:p+n , p-n , p++ , p-- , ++p , --p

p-= n , p+= n , p1-p2 等

其中n是整数,p、p1、p2均为指针;

施行加法运算时,指针向地址增大的方向移动;

施行减法运算时,指针向地址减小的方向移动;

移动长度取决于指针的基类型,由计算机决定;

如有:int a,b,c, *pt =&a;

则pt++ 则指针向后移动两个字节;

再如:main()

{ int *p1,a=8,b=3;

p1=&a;

printf(“%d,%d\n”, (*p1)++, *p1++);

printf(“%d,%d\n”,a, *p1);

}

运行结果:3 ,8

8 ,4

注:p1+k = p1+k*sizeof(p1的基类型);

p1- k = p1- k*sizeof(p1的基类型);

如:

strlen(char *s)

{ char *p=s;

while(*p!=…\0‟)p++;

return(p-s);

}

2、指针的关系运算

设指针p1,p2指向同一数组中的元素,则

p1

p1

p1= =p2:表示p1、p2指向数组中的同一元素;

同理可推出>、>=、<=、!=比较的意义;

不可将指针与其他类型的对象作比较;

若两指针指向不同数组中的元素,也不可比较;

允许将指针与NULL或数值0进行= =或!=的比较,以便判定一个指针是否为空指针。步骤三课堂小结

本课介绍了指针与地址的概念,指针变量的定义、初始化及指针的运算。

指针:就是地址,即内存单元的编号。

指针变量:用来存放另一变量的地址(即指针)的变量。

例如:int a=5, *p=&a;

printf ( “%d”, *p );

注意:运算符*和&的用法,指针变量的自加自减运算。

步骤四布置作业

课后作业:第十章课后练习10.110.2

课题:第十章指针§3 教学目的:掌握指针与数组的知识

教学重点:教学难点:指向数组的指针变量指向二维数组的指针

步骤一复习引导

上节课介绍了指针变量的定义及其赋值。一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组和数组元素(把数组起始地址或某一元素的地址放到一个指针变量中)。

步骤二讲授新课

所谓数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。

引用数组元素可以用下标法(如a[3]),也可以用指针法,即通过指向数组元素的指针找到所需的元素。使用指针法能使目标程序质量高(占内存少,运行速度快)。

一、指向一维数组的指针

定义形式:

int a[10];

int *p;

p=&a[0]; 或p=a;

含义:把数组的首地址赋给指针变量p。

也即:int *p=&a[0]; 或int *p=a;

二、通过指针引用数组元素

按C的规定:如果指针变量p已指向数组中的一个元素,则p+1指向同一个数组中的下一个元素(而不是简单地加1)。

如果p的初值为&a[0],则:

p+i ↔ a+i ↔ &a[i],即指向a数组的第i个元素。

*(p+i) ↔ *(a+i) ↔a[i]。

指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价

引用数组元素时,可以用:

1、下标法,如:a[i]

2、指针法,如:*( a+i ) 或*( p+i )

其中,a是数组名,p是指向数组的指针

例10.5:输出数组中的全部元素

假设有一个a数组,整型,有10个元素。用三种方法输出各元素的值:

1、下标法:

main()

{ int a[10], i ;

for( i=0; i<10 ; i++)

scanf(“%d”,&a[i]);

printf(“\n”);

for( i=0 ; i<10; i++)

printf(“%d”,a[i]);

}

2、利用数组名计算数组元素地址,找出元素的值。

main()

{ int a[10], i ;

for( i=0; i<10 ; i++)

scanf(“%d”,&a[i]);

printf(“\n”);

for( i=0 ; i<10; i++)

printf(“%d”,*(a+i));

}

3、用指针变量指向数组元素。

main()

{ int a[10], *p, i ;

for( i=0; i<10 ; i++)

scanf(“%d”,&a[i]);

printf(“\n”);

for( p=a; p<(a+10); p++)

printf(“%d”,*p );

}

评注:

1、第1和2种方法执行效率是相同的。

2、第3种方法效率高。

3、用下标法比较直观。

在使用指针变量时,有几个问题要注意:

1、指针变量可以实现使本身的值改变。如:for(p=a; p<(a+10); p++)

2、要注意指针变量的当前值。

如:要通过指针变量输出a数组的10个元素。

main()

{ int a[10], i , *p=a;

for( i=0; i<10 ; i++)

scanf(“%d”, p++);

printf(“\n”);

for( i=0 ; i<10; i++,p++)

printf(“%d”, *p);

}

这个程序输出的并不是a数组中各元素的值。因为第一个for 循环结束时,p已经指向数组的末尾。再继续下去,p指向的是a数组下面的10个元素,是不可预料的。

可加一句为:p=a;

3、用指针变量p指向数组元素,可以指到数组以后的内存单元。C编译程序不作下标越界检查。

4、注意指针变量的运算。如果p指向数组a,

⑴p++ (或p+=1 ),使p指向下一元素a[1]。

⑵*p++等价*(p++)。作用是先得到p指向的变量的值(即*p),然后再使p+1→p。

⑶*(p++)与*(++p)不同。前者为a[0],后者为a[1]

⑷(*p)++表示p指向的元素值加1,即(a[0])++

⑸如果p当前指向a数组中第i个元素,则:

*(p- -)相当于a[i- -],先对p进行*运算,再使p自减;

*(+ + p)相当于a[+ +i],先使p自加,再作*运算。

*(- - p)相当于a[- -i],先使p自减,再作*运算。

三、数组名作函数参数

用数组名作实参,在调用函数时是把数组的首地址传送给形参。即实参数组与形参数组共占同一段内存。

例10.7 将数组a中的n个整数按相反顺序存放。

分析:将a[0]与a[n-1]对换,再将a[1]和a[n-2]对换……,直到将a[(n-1)/2]与a[n-int((n-1)/2]对换。设i和j,i的初值为0,j的初值为n-1。将a[i]和a[j]交换,然后使i的值加1,j的值减1,再将a[i]和a[j]交换,直到i=(n-1)/2为止。

void inv(int x[], int n)

{ int temp, i, j,m=(n-1)/2;

for( i=0; i<=m; i++)

{ j=n-1-i ;

temp=x[i];

x[i]=x[j];

x[j]=temp;

}

return;

}

main()

{ int i, a[10]={3,7,9,11, 0,6,7,5,4,2};

printf(“The array: \n ”);

for( i=0; i<10; i++) printf(“%d”,a[i]);

printf(“\n”);

inv(a,10);

printf(“The array : \n”);

for( i=0; i<10; i++) printf(“%d”,a[i]);

printf(“\n”);

}

例10.8 从10个数中找出其中最大值和最小值。

int max,min;

void max_min_vlue(int array[], int n)

{ int *p,*array_end;

array_end=array+n;

max=min=*array; /*等价max=min=array[0]*/

for(p=array+1;p

if(*p>max) max=*p;

else if (*p

return;

}

main()

{ int i, number[10];

printf(“enter 10 integer number:\n”);

for( i=0; i<10; i++)

scanf(“%d”,&number[i]);

max_min_value(number,10);

printf(“\n max=%d,min=%d\n”,max.min);

}

如果有一个实参数组,想在函数中改变此数组的元素的值,实参与形参的对应关系有以下4种情况:

1、形参和实参都用数组名;

main()

{ int a[10];

f (a,10);……

}

f ( int x[],int n )

{ …… }

a和x指的是同一个数组

2、实参用数组名,形参用指针变量;

main()

{ int a[10];

f( a, 10 );

……

}

f( int *x, int n )

{ …… }

开始时,x指向a[0]

3、实参形参都用指针变量;

main()

{ int a[10], *p;

p = a;

f ( p, 10 );

……

}

f ( int *x, int n )

{ …… }

实参p和形参x都指向数组a

4、实参为指针变量,形参为数组名。

main()

{ int a[10], *p;

p = a;

f( p, 10 );

……

}

f ( int x[], int n )

{ …… }

p指向数组a,x和a共用同一段内存单元

例10.9 用实参指针变量将a数组中n 个整数按相反顺序存放. void inv(int *x, int n)

{ int *p, m, temp, *i, *j;

m=(n-1)/2;

i=x; j=x+n-1; p=x+m;

for( ; i<=p; i++, j- - )

{ temp=*i;

*i = *j;

*j =temp;

}

return;

}

main()

{ int i, a[10],*p=a;

printf(“The original array: \n ”);

for( i=0; i<10; i++,p++) scanf(“%d”, p);

printf(“\n”);

p=a;

inv(p,10);

printf(“The array is : \n”);

for( p=a; p

printf(“%d”, *p);

printf(“\n”);

}

例10.10:用选择法对10个整数排序。

main()

{int *p, i, a[10];

p=a;

for( i=0; i<10; i++) scanf(“%d”,p++);

p=a;

sort(p,10);

for( p=a, i=0; i<10; i++)

{ printf(“%d”,*p);p++;}

}

sort(int x[],int n)

{ int i, j, k, t;

for( i=0; i

{ k=i;

for(j=i+1; j

if(x[j]>x[k]) k=j;

if( k !=i)

{ t = x[i];

x[i] = x[k];

x[k] = t; }

}

四、指向二维数组的指针和指针变量

1、二维数组的地址如:

int a[3][4]

A a[0] a[0] [0] a[0] [1] a[0] [2] a[0] [3]

A+1 a[1] a[1] [0] a[1] [1] a[1] [2] a[1] [3]

A+2 a[2] a[2] [0] a[2] [1] a[2] [2] a[2] [3]

例:int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

设首地址为2000。

●a[k]+p ( 0<=k< i , 0<=p

由此得到: *(a[k]+p) 等价于a[k][p];

●a[0]与&a[0][0]等价;

●a+k与&a[k][0]等价,而a[0]+k与&a[0][k]等价;

●*(a+i)可理解为a[i],故有如下等价关系:

a+0 等价于a[0]、a[0]+0、&a[0][0]、*(a+0)

a+1 等价于a[1]、a[1]+0、&a[1][0]、*(a+1)

a+(i-1) 等价于a[i-1]、a[i-1]+0、&a[i-1][0]、*(a+i-1)

●*(a+k)与*a[k]是不同的,前者相当于a[k],是一个地址值;后者相当于*(a[k]+0)或

*&a[k][0],是数组元素a[k][0]中存储的值。

●数组元素a[k][p]就是*(a[k]+p),即*(*(a+k)+p)

步骤三课堂小结

本课介绍了指向数组的指针,主要是指向一维数组的指针。用指针变量p指向数组a,指针变量p可以++、--,表示指向数组的上一元素或下一元素。但C编译程序不作下标越界检查。使用指针既方便有灵活,但初学者容易搞错。

步骤四布置作业

课后作业:第十章课后练习10.3110.5

课题:第十章指针§3-§4

教学目的:在掌握指针与数组的基础上,掌握字符串的指针与指向字符串的指针变量

教学重点:教学难点:指向字符串的指针变量用指针处理字符串

步骤一复习引导

上节课介绍了指向一维数组的指针及二维数组的地址,指向一维数组的指针也即指向元素的指针,那么指向二维数组的指针是怎样的呢?它有两种类型。

步骤二讲授新课

2、指向二维数组的指针变量

——(1)指向数组元素的指针变量

设指针变量p=a[0] (&a[0][0]、a、a+0、*(a+0) )

计算a[i][j]在n*m数组中的位置:

例:……

for( i=0; i<3; i++)

{for( j=0; j<4; j++ ) printf (“%4d”, *(p+i*m+j));

printf(“\n”); }

……

例:用指针变量输出数组元素的值。

main()

{ int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

int *p;

for( p=a[0]; p

{if((p-a[0])%4 == 0) printf(“\n”);

printf(“%4d”, *p);

}

}

计算a[i][j]在n*m数组中的位置:a[0]+i*m+j

——(2)行指针(指向由m个元素组成的一维数组的指针变量)

定义:指针基类型(*指针名)[m]

其中,m表示二维数组每行有m列;

如:int (*p)[3];

于是,p 指向第0行元素的起始存储地址;

p+1 指向第1行元素的起始存储地址;……

p+I 指向第i 行元素的起始存储地址;

而每一行的元素的表示形式为:

第0行元素的表示为(*p)[j];

第1行元素的表示为(*(p+1))[j];……

第i 行元素的表示为(*(p+ I))[j];

例:

#include

main()

{ int (*p)[4], j;

int a[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};

for(p=a; p

for(j=0;j<4; j++)

if( j==3 ) printf(“%4d\n”, (*p)[j] );

else printf(“%4d” , (*p)[j] );

}

改写为:

#include

main()

{ int (*p)[4], i, j;

int a[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};

p=a;

for( i=0; i<4; i++)

for(j=0;j<4; j++)

printf(j==3?“%4d\n”: “%4d” , *(*(p+i )+j) );

}

3、多维数组的指针作函数参数

一维数组的地址可以作为函数参数传递,多维数组的地址也可作函数参数传递。在用指针变量作形参以接受实参数组名传递来的地址时,有两种方法:

1、用指向变量的指针变量;

2、用指向一维数组的指针变量。

例;有一个班,3个学生,各学4门课,计算总平均分数,以及第n个学生的成绩。

main()

{ void average(float *p ,int n);

void search(float (*p)[4], int n);

float score[3][4]={{65,67,70,60},{80,87,90,81}, {90,99,100,98}};

average( *score, 12); /*求12个分数的平均分*/

search(score , 2); /*求第2个学生成绩*/

}

void average(float *p , int n)

{float *p_end;

float sum= 0,aver;

p_end = p+n-1;

for(; p<=p_end; p++) sum =sum+(*p);

aver = sum/n;

printf(“average=%5.2f\n”,aver);

}

void search(float (*p)[4], int n)

{ int i;

printf(“the score of No %d are:\n”,n);

for( i=0; i<4; i++)

printf(“%5.2f”, *(*(p+n)+i));

}

例10.15 在上题基础上,查找一门以上课程不及格的学生,打印出他们的全部课程的成绩。main()

{ void search(float (*p)[4], int n);

float score[3][4]={{65,57,70,60},{58,87,90,81),{90,99,100,98}};

search(score, 3);

}

void search(float (*p)[4], int n)

{int i, j, flag;

for( j=0; j

{ flag = 0;

for( i=0; i<4; i++)

if(*(*(p+j)+i)<60) flag =1;

if(flag==1)

{ printf(“No %d fails,his scores are:\n”,j+1);

for( i=0; i<4 ; i++)

printf(“%5.1f”, *(*(p+j)+i) );

printf(“\n”);

}

}

}

§10.4字符串的指针和指向字符串的指针变量

一、字符串的表示形式

1、用字符数组存放一个字符串。

如:main()

{ char string[ ]=“I love China!”;

printf(“%s\n”, string); }

2、用字符指针指向一个字符串。

如:main()

{ char *string=“I love China!”;

printf(“%s\n”, string); }

例10.18将字符串a复制为字符串b。

main()

{ char a[]=“I am a boy.” , b[20];

int i;

for( i=0; *(a+i)!=…\0‟; i++) *(b+i) = *(a+i);

*(b+i) = …\0‟;

printf(“string a is : %s\n”, a);

printf(“string b is :”);

for( i=0; b[i]!=…\0‟; i++ )

printf(“%c”, b[i] );

printf(“\n”);

}

例10.19用指针变量来处理上例。

main()

{ char a[ ]=“I am a boy.” , b[20], *p1, *p2;

int i;

p1= a; p2= b;

for( ; *p1!=…\0‟; p1++,p2++ ) *p2 = *p1;

*p2 = …\0‟;

printf(“string a is : %s\n”, a);

printf(“string b is :”);

for( i=0; b[i]!=…\0‟; i++)printf(“%c”, b[i]);

printf(“\n”);

}

二、字符串指针作函数参数

例10.20:用函数调用实现字符串的复制。——(1)用字符数组作参数。

void copy_string(char from[],char to[])

{ int i=0;

while( from[i]!=…\0‟ )

{ to[i] = from[i]; i++;}

to[i]=…\0‟;

}

main()

{ char a[]=“I am a teach.”;

char b[]=“you are a student.”;

printf(“string a= %s\nstring b=%s\n”,a,b);

copy_string(a,b);

printf(“\nstring a=%s\nstring b=%s\n”,a,b); }

——(2)形参用字符指针变量

void copy_string(char *from,char *to)

{ for(; * from!=…\0‟; from++, to++ )

*to = *from;

*to=…\0‟;

}

——(3)对copy_string函数还可以简化。

①void copy_string(char *from, char *to)

{ while((*to =* from)!=…\0‟)

{ to ++; from++;}

}

②void copy_string(char *from, char *to)

{ while((*to ++ =* from++)!=…\0‟); }

③void copy_string(char *from, char *to)

{ while(* from!=…\0‟) *to++ = *from ++;

*to = …\0‟;

}

④void copy_string(char *from, char *to)

{ while(*to++ = *from ++); }

⑤void copy_string(char *from, char *to)

{ for( ;*to++ = *from ++;); }

⑥void copy_string(char from[], char to[])

{ char *p1,*p2;

p1=from; p2=to;

while((*p2++ = *p1++)!=…\0‟);

}

三、字符指针变量和字符数组的讨论

1、字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址,

决不是将字符串放到字符指针变量中。

2、赋值方式。对字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值;

char str[14];

str=“I love China.”;对字符指针变量,可以采用下面方法赋值:

char *a;

a= “I love China.”; /*赋给a的是串的首地址*/

3、对字符指针变量赋初值:

char *a=“I love China.”; 等价于char *a;

a=“I love China.”;

而对数组的初始化:

char str[14]={“I love China.”}; 不等价于char str[14];

str[]=“I love China.”;

即数组可以在变量定义时整体赋初值,但不能在赋值语句中整体赋值。

4、如果定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个地址值,也就是说,该指针变量可以指向一个字符型数据,但如果未对它赋一个地址值,则它并未具体指向一个确定的字符数据。这很危险。

如:char str[10];

scanf(“%s”,str); 是可以的

char *a;

scanf(“%s”,a); 能运行,但危险,不提倡,在a单元中是一个不可预料的值。

应当char *a,str[10]; a=str; scanf(“%s”,a);

5、指针变量的值是可以改变的,数组名虽然代表地址,但它的值是不能改变的。可以下标形式引用所指的字符串中的字符。

如:main()

{char *a=“I love China.”;

a=a+7;

printf(“%s”,a); }

又如:char str[]={“I love China.”}; str=str+7; printf(“%s”,str); 是错的

6、用指针变量指向一个格式字符串,可以用它代替printf函数中的格式字符串。也可以用字符数组实现,但由于不能采用赋值语句对数组整体赋值。

如:char *format; format=“a=%d,b=%f\n”; printf(format,a,b);

等价于:printf(“a=%d,b=%f\n”,a,b);

也可以:char format[ ]=“a=%d,b=%f\n”; printf(format,a,b);

步骤三课堂小结

本课介绍了指针与二维数组、指针与字符串,指向二维数组的指针有指向元素的指针和行指针,使用时应注意它们的区别。我们既要掌握用数组处理字符串,也要掌握用指针变量处理字符串。要区分这两种方法的不同之处。

步骤四布置作业

课后作业:第十章课后练习10.6110.7

课题:第十章指针§5-§7

教学目的:了解指针与函数的概念

掌握指针数组,二级指针等知识

教学重点:教学难点:掌握指针数组,二级指针等知识指针数组,二级指针

步骤一复习引导

前面介绍了指针与维数组、指针与字符串,我们可以用指针变量指向整型变量、字符串、数组,也可以指向一个函数。

步骤二讲授新课

§10.5函数的指针和指向函数的指针变量

函数的地址:函数存储区域的首地址就是该函数的入口点,其函数名表示了入口地址。

一、函数指针变量的定义:

存储类型数据类型(*函数指针名)( );

例:static int (*p)( );

例10.23求a和b中的大者。

main()

{ int max(int, int);

int a,b,c;

scanf(“%d,%d”,&a,&b);

c=max(a,b);

printf(“a=%d,b=%d,\

max=%d”,a,b,c);

}

max(int x, int y)

{ int z;

if(x>y) z=x;

else z=y;

return(z);

}

法2:main()

{ int max(int, int);

int (*p)( );

int a,b,c;

p=max; /*将地址送入p */

scanf(“%d,%d”,&a,&b);

c=(*p)(a,b); /*与max(a,b)等价*/

printf(“a=%d,b=%d,max=%d”,a,b,c);

}

注:int (*p)()定义p是一个指向函数的指针变量,此函数带回整型的返回值。

说明:

1、函数的调用可以通过函数名调用,也可以通过函数指针调用。

2、(*p)() 表示定义一个指向函数的指针变量,它不是固定指向哪一个函数的,而只是表示定义了这样一个类型的变量,它是专门用来存放函数的入口地址的。

3、在给函数指针变量赋值时,只需给出函数名而不必给出参数,如:p=max; 。

4、用函数指针变量调用函数时,只需将(*p)代替函数名即可(p为指针变量名),在(*p)之后的括号中根据需要写上实参。如:c=(*p)(a,b);

5、对指向函数的指针变量,像p+n、p++、p--等运算是无意义的。

二、用指向函数的指针作函数参数

函数的参数可以是变量、指向变量的指针变量、数组名、指向数组的指针变量等。现介绍指向函数的指针也可以作为参数,以便实现函数地址的传递,也就是将函数名传给形参。

它的原理可以简述如下:有一个函数(假设函数为sub),它有两个形参(x1和x2),定义x1和x2为指向函数的指针变量。在调用函数sub时,实参用两个函数名f1和f2给形参传递函数地址。这样在函数sub中就可以调用f1和f2函数了。

有人会问,既然在sub函数中要调用f1和f2函数,为什么不直接调用f1和f2而用函数指针变量呢?的确,如果只是用到f1和f2,完全可以直接在sub函数中直接f1和f2,而不必设指针变量x1、x2。但是,如果在每次调用sub函数时,要调用的函数是不固定的,这次调用f1和f2,而下次要调用f3和f4,第三次要调用的名作为实参即可,sub函数不必作任何修改。这种方法是符合结构化程序设计方法原则的,是程序设计中常使用的。

例10.24 设一个函数process,在调用它的时候,每次实现不同的功能。

main()

{ int max(int ,int );

int min(int , int);

int add(int , int);

int a, b;

printf(“enter a and b:”);

scanf(“%d,%d”, &a, &b);

printf(“max=”); process(a,b,max);

printf(“min=”); process(a,b, min);

printf(“sum=”); process(a,b, add);

}

max(int x, int y)

{ int z;

if(x>y) z = x; else z = y;

return(z);

}

min(int x, int y)

{ int z;

if(x

else z = y;

return(z);

}

add( int x, int y)

{ int z;

z = x+y;

return(z);

}

process(int x, int y, int (*fun)(int ,int))

{int result;

result = (*fun)(x,y);

printf(“%d\n” , result );

}

在函数process定义中,int (*fun)(int,int)表示fun是指向函数的指针,该函数是一个整型函数,有两个整型形参。

在三次调用中,分别将函数名max、min、add作为实参将其入口地址送给process函数中的形参fun(fun是指向函数的指针变量)。例:process函数中的(*fun)(x,y)相当于max(x,y)。

注:在使用时,应将函数声明,这样编译系统将它按函数名处理(把函数入口地址作实参值),而不是作为变量名,不致出错。

Process函数无固定功能。如果max、min、add换成其它函数,此process函数不需改变,只要修改每函数的函数体。

§10.6 返回指针值的函数

一个函数可以带回一个整型值、字符值、实型值等,也可以带回指针型的数据,即地址。其概念与以前类似,只是带回的值的类型是指针类型而已。

格式:类型名*函数名(参数表);

例:int *a(int x, int y);

a是函数名,调用它以后能得到一个指向整型数据的指针(地址)。

例10.25 有若干个学生的成绩(每个学生有4门课程),要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针函数来实现。

float *search( float (*pointer)[4], int n)

{float *pt;

pt = *(pointer +n);

return( pt ); }

main()

{ float score[][4]={{60,70,80,90},{56,89,67,88),{34,78,90,66}};

float *p; int i, m;

printf(“enter the number of student:”);

scanf(“%d”,&m);

printf(“The score of No.%d are:\n”, m);

p=search(score, m);

for( i=0; i<4; i++) printf(“%5.2\t”, *(p + i)); }

例10.26对上例中的学生,找出其中有不及格课程的学生及其学生号。

float *search(float (*pointer)[4])

{ int i;

float *pt;

pt = *(pointer+1);

for( i=0; i<4 ; i++)

if(*(*pointer+i)<60) pt = *pointer;

return(pt);

}

C语言实验六实验报告——指针

一、实验项目名称 指针 二、实验目得 1.掌握指针得基本概念与基本用法。包括:变量得地址与变量得值,指针变量得说明、指针变量得初始化、指针得内容与定义格式、指针得基本运算等; 2.掌握数组与指针得关系并能够利用指针解决数组得相关问题; 3。掌握字符串与指针得关系并能够利用指针处理字符串得问题; 4。掌握指针与函数得关系并能够利用指针处理函数问题; 5.了解指向指针得指针得概念及其使用方法; 6。能够使用指针进行程序设计。 三、实验内容 有关指针得程序设计 1。编程实现:任意输入得10个数,求其平均值。 要求: (1)10个数采用scanf语句读入。 (2)利用指针实现对这10个数得访问。 (3)要求平均值得精度为小数后面2位。 2。编程实现:将一个任意整数插入到一个已排序得整数数组中,插入后数组中得数仍然保持有序. 要求: (1)整数数组由初始化方式输入。任意整数由scanf函数输入; (2)实现过程采用指针处理; (3)输出原始数组数据以及插入数据后得数组数据并加以相应说明。 3。编写函数newcopy(char *new,char *old),它得功能就是删除old所指向得字符串中得小写字母,并将所得到得新串存入new中。 要求: (1)在主函数中以初始化方式输入一个字符串; (2)调用newcopy()函数; (3)在主函数中输出处理后得结果. 4。编程实现:输入三个整数,按由大到小得顺序输出。

要求: (1)通过scanf函数输入三个数据并存入三个变量中; (2)利用指针实现从大到小输出; (3)修改程序,将三个整型数据改为字符型数据,输入三个字符,按从大到小数顺序输出; (4)修改程序,将三个字符型数据改为字符串数据,输入三个字符串,按从小到大顺序输出; (5)体会指针对不同数据处理得特点. 四、实验步骤及结果 一、 #include

c语言程序设计--指针

c语言程序设计--指针 一、地址 1.内存是计算机进行数据运算的物理空间,地址即内存中的指定位置。 2.操作符“&”作用于变量,找到地址。操作符“*”作用于地址,取得该地址内存中存储的变量。 二、地址应用 1.变量地址做函数参数 void fun1(int *a) { 函数体; } int main() { int a=5; fun1(&a); return 0; } 2.数组做函数参数 void fun1(int a[]) { 函数体;

} int main() { int a[5]={5,4,3,21,7}; fun1(a); return 0; } 三、指针 1.指针是存放变量地址的变量 2.声明格式:类型说明符*标识符; 3.指针可以指向变量、常量、数组、字符串、结构体、函数。 4.指针需要初始化 例:int *a; int num=5; a=# 5.指针指向同一变量时可以进行比较运算,例如当两个指针指向同一数组时,比较运算表示比较两个指针在数组中位置的大小。两个指针相等表示他们指向数组中的同一个元素。 6.指针和整数进行加减运算,编译器会根据所指对象的数据长度对该整数进行放大,char的放大因子为1,int和short的放大因子为2,long和float的放大因子为4,double的放大因子为8。 7.当两个指针指向同一变量时,他们可以进行减运算。例如,当两个

指针指向同一个数组时,他们的差是两个指针之间元素的个数。相减的结果遵守对象类型的字节长度的缩减规则。 8.指向数组的指针 数组在内存空间中的存储是连续的,数组名表示数组的第一个元素的地址。

《C语言程序设计》教材习题答案第10章

一、选择题 1. 设已定义“int a,* p”,下列赋值表达式中正确的是:C)p=&a 2. 设已定义“int x,*p=&x;”,则下列表达式中错误的是:B)&*x 3. 若已定义“int a=1 ,*b=&a;”,则“printf(“%d \n”,*b);”的输出结果为:A) a的值。 4. 设已定义“int x,*p,*pl=&x,*p2=&x;”,则下列表达式中错误的是:C)p=p1+p2. 5. 设有函数定义“void p(int *x){printf(“%d\n”,*x);}”和变量定义“int a=3;”,则正确的函数 调用是:C)p(&a) 6. 函数“int fun(char * x){char * y=x; while(*y)y++;return(y-x); }”的功能是A)求字 符串的长度。 7. 运行一下程序,输出结果为:B)5 6 int fun (int a,int *b) { a++;(*b)++; return a+*b; } void main() {int x=1,y=2; Printf(“%d”,fun(x,&y)); Printf(“%d”,fun(x,&y)); } 8. 运行以下程序,输出结果为:C)58 #include Int * fun(int a ,int *b) {a++;(*b)++; *b=a+*b; return b; } Void main() { Int x=1,y=2,*z; Z=fun(x,&y); Printf(“%d”,*z); Z=fun(x,&y); Printf(“%d”,*z); } 9. 若已定义“int a[]={1,2 ,3,4},*p=a;”,则下面表达式中值不等于2的是C)*(++a) 10. 若已定义“int a[]={1,2 ,3,4},*p=a+1;”,则p[2]的值为C)4 11. 设已定义“int x[4][10],*p=x[0];”,则下列表达式中的值为整形的是B)*(p+1) 12. 设已定义“char s[]=”ABCD”;”,”printf(“%s”,s+1)”的值为C)BCD

C语言程序设计教案 第十章指针

第十章指针 课题:第十章指针§1-§2 教学目的:1、了解指针与地址的概念 2、掌握指针变量的定义、初始化及指针的运算 教学重点:教学难点:指针变量的定义、初始化及指针的运算指针的运算 步骤一复习引导 指针是C语言的一个重要概念,也是C语言的一个重要特色。正确而灵活地运用它,可以有效地表示复杂的数据结构;能动态分配内存;能方便地使用字符串;有效而方便地使用数组;在调用函数时能得到多于1个的值;能直接处理内存地址等,这对设计系统软件是很必要的。 指针的概念比较复杂,使用也比较灵活,因此初学者时常会出错,务请在学习本章内容时十分小心。 步骤二讲授新课 §10.1 地址和指针的概念 计算机的主存储器被分成一个个存储单元,为了区分各存储单元,要为每个存储单元编号,这个编号即地址。 例:i =3; 或scanf(“%d”, &i); 是将3送给i所在的空间。 例:将3送到变量I_pointer所“指向”的单元(即I所标志的单元)。 所谓“指向”,是通过地址来体现的,I_pointer中的值为2000,它是变量I 的地址,这样就在I_pointer和变量之间建立起一种联系,即通过I_pointer能知道I的地址,从而找到变量I 的内存单元。因而在C语言中,将地址形象化地称为“指针”。 意思是通过它能找到以它为地址的内存单元。一个变量的地址称为该变量的“指针”。 内存单元的地址和内存单元的内容是两个不同的概念。 指针:就是地址,即内存单元的编号。 指针变量:用来存放另一变量的地址(即指针)的变量。 如:地址2000是变量i的指针;i_pointer是指针变量,其值就是指针2000。 §10.2变量的指针和指向变量的指针变量 变量的指针就是变量的地址。 存放变量地址的变量是指针变量,用来指向另一个变量。 *i_pointer 表示i_pointer 所指向的变量。 一、定义一个指针变量 指针变量的定义包含三个方面的内容: ⑴指针类型说明,即定义变量为一个指针变量 ⑵指针变量名 ⑶变量值(指针)所指向的变量的数据类型。 格式:存储类型基类型*指针变量名; 例:int *pointer_1, *pointer_2; float *pointer_3; char *pointer_4;

《C语言程序设计教程》(第三版)李凤霞 主编——第十章习题答案

习题十 一、单选题 1~5 DDDCC 6~10 AABDB 11~14 CADC 二、填空题 1、34 12 2、ARRAY a,b,c; 3、1 3 4、a c 5、(*b).day=? b->day=? 5、分析下列程序执行结果。 #include “stdio.h” main() {static struct s1 {char c[4],*s; s1={“abc”,”def”}; static struct s2 {char *cp;struct s1 ss1; }s2={“ghi”,{“jkl”,”mno”}}; printf(“%c%c\n”,s1.c[0],*s1.s); /*output ab */ printf(“%s%s\n”,s1.c,s1.s); /*output abcdef */ printf(“%s%s\n”,s2.cp,s2.ss1.s); /*output ghimno */ printf(“%s%s\n”,++s2.cp,++s2.ss1.s); /* output hino */ } 6、以下程序的功能是:读入一行字符(如:a,...,y,z),按输入时的逆序建立一个链式的结点序列,即 先输入的位于链表尾(如下图),然后再按输入的相反顺序输出,并释放全部结点。 #define getnode(type)_________malloc(sizeof(type)) ( (struct node *)) main() {struct node {char info; struct node *link; }*top,*p; char c; top=NULL; while((c=getchar())______________) (!='\n') {p=getnode(struct node); p->info=c; p->link=top; top=p; } while(top) {_________________; (p=top) top=top->link; putchar(p->info); free(p);

C语言程序设计_指针C语言学

C语言程序设计指针C语言学习 重点: 1、C语言中指针的概念 2、指针变量的相关操作 3、指针与数组的关系 4、内存空间的动态分配 第1节C语言中指针 一、指针与指针变量 一台计算机的内存单元非常多,为了相互区分,就给它们采取编号的方法,按十进来说,从0开始编号,即0,1,2……,这种对每个内存单元的唯一的编号叫做内存单元的地址。计算机对内存的访问一般采取“按地址访问”的方式。 变量(指前面所讲的普通变量)的实质对应的是内存单元,对变量的操作实质是对相应内存单元中所存放的数据的操作:给变量赋一个值,实质是将一个值存入与此变量对应的内存单元;读取一个变量的值,实质是从对应的内存单元中取出存放的数据。 有时,我们要用到内存单元的地址,这种情况下,可利用C语言中的“指针”数据类型来实现。 指针就是变量的地址,实质是内存单元的地址。 可以用变量来存放指针,称为指针变量,但跟普通变量不同的是,普通变量存放数据,指针变量存放的是变量的地址,即内存单元的地址。 1、指针变量的定义 数据类型符*变量名; 如: int *a,*b;

float *fp; 2、指针变量的赋值 1)初始化赋值 数据类型*指针名=初始地址值; 例: int x=20;//定义了一个普通的整型变量 int *p=&x; //定义了一个指向整型变量的指针变量,并让p指向变量x所对应的内存单元,即p中存入x所对应的内存单元的地址。如下图: 例: int i; int *p = &i; int *q = p; 2)赋值语句赋值 int a; int *p; p = &a; 3、与指针相关的运算符 &:取地址运算符,获得变量的地址 *:访问指针所指变量内容的运算符 上例中,要获得内存单元10000中的内容有两种办法: ①直接访问:按变量名来存取变量值。上例中可通过x来实现; ②间接访问:通过存放变量地址的指针变量去访问。上例中可通过*p访问。

C语言程序设计实验十指针2

C语言程序设计实验十——指针2 【实验1】 实验题目: 1、设计一个C程序,用以测试下列各表达式的运算。 (1)y=*px++ (2)y=*++py (3)y=(*py)++ (4)y=--*ppx++ 2、在以下程序中1~9注释部分添加该行的功能,运行后分析其输出结果。 #include #define N 5 void funout(int *iA,float *fB,double *dC); main() { int iA[N]={10,20,30,40,50}; float fB[N]={11.5,12.5,13.5,14.5,15.5}; double dC[N]={92.2,93.3,94.4,95.5,96.6}; funout(iA,fB,dC); } void funout(int *iA,float fB[N],double dC[]) { int i=0,*iX=iA; float *fY=fB; double *dZ=dC; for(i=0;i

C语言程序设计 指针

实验6 指针 学号:姓名:实验日期: 一、实验目的和要求 (1)掌握指针的概念、指针变量定义和引用。 (2)掌握指针的运用方法。 (3)掌握数组的指针和指向数组的指针变量。 (4)掌握指针与函数的关系。 (5)能正确使用字符串的指针和指向字符串的指针变量。 (6)了解指向函数的指针。 (7)了解指向指针变量的指针的概念及其使用方法。。 二、实验内容(注意:由于本实验报告模板中已经有题目内容,故源代码中无需再 附上教材上的题目编号信息,只需有你的学号和姓名信息即可。以下所有题目都要求代码与运行结果一起截图,只有在代码实在过多无法一起截图情况下,才能分开 截图) 1、【编写程序】请用指针编程实现:从键盘输入10个数,求出其中的最小值。 提示:定义函数lookup(int *str,int *a,int n)查找数组str中的最小值,将数组中的每一个数跟第一个数进行比较,最后得到最小的数。 2、【编写程序】请用指针编程实现:编写函数change(char *s,int *p),将字符串s 中的数字字符转换成数字存储到整型数组p中,函数返回转换后的数字的个数。提示:先检测字符是否为数字,数字的ASCII码值为30H~39H,逐个判断s中的字符,如果是数字字符,则将其转换成数字存储到整型数组中。

3、【编写程序】请用指针编程实现:先读入10个整数,然后把它们按从大到小的次序排列起来,最后再读入一个整数k,并将k插入到该整数数列中,插入后的数列仍然按从大到小的顺序排列。要求:编写一个函数实现排序功能。 4、【编写程序】请用指针编程实现:从键盘输入一个字符串,判断输入的字符串是否为回文。(回文是指正序和反序字符排例方式相同的字符串,如abcdcba是回文)。

C语言指针教学设计

C语言指针教学设计 1.关于C语言程序设计中的指针 C语言程序设计是高校理工科专业的一门重要专业或公共基础课,不仅是计算机相关专业学生进一步学习汇编语言程序设计、数据结构计算机操作系统、硬件编程等课程的入门级课程,同时也是非计算机专业学生了解计算机软硬件基础知识和计算机底层原理的重要手段之一.在教学内容的组织上,强调和分析指针与基本数据类型、函数、数组的内在联系,灵活设计教学程序实例,为学习者掌握指针及c语言程序设计创造良好条件。指针是C语言的教学重点,程序使用指针可以带来很多方便,如: 1)灵活操作数组(含字符串); 2)动态分配内存; 3)表示复杂的数据结构; 是让程序更加简洁高效的重要手段。然而指针也是C语言学习的最大难点,学习者普遍感觉指针概念抽象,致使无法正确理解并使用指针,而指针的使用稍有不慎,往往会给c语言程序带来致命的错误。 2.学生分析 在讲指针内容之前,学习者经历了基本数据类型、运算符和表达式、输入输出函数、选择制语句、循环控制语句、函数、数组等内容的学习。而指针内容之后,一般还要讲授指针与字符串、指针与数组、结构体与共用体、文件操作等内容。其中指针起到了承前启后的作用,学习并掌握指针,对学习者获得程序设计技巧和能力、继续学习其它计算机专业课程至关重要。 3.教师自我思考 在课堂教学中起主导作用的教师,应根据指针教学所必需的基础知识,在授课过程中不断调各关键知识点的重要性,尽可能在指针内容的学习之前,使学习者具备理解指针概念的基础知识和基本能力。在教学内容的组织上,强调和分析指针与基本数据类型、函数、数组的内在联系,灵活设计教学程序实例,为学习者掌握指针及c语言程序设计创造良好条件。 4.学生学习方法建议 学习本章内容时,应重点掌握指针与指针的区别、指针的引用方法和运算,并在此基础上进一步理解指针作为函数参数和在数组当中的的应用,要求多读程序,理解编程的算法、编程的思路,并仿照例题多编程序、上机练习,真正掌握

《C语言程序设计》第十章文件

《C语言程序设计》第十章文件 C语言文件操作是指对文件进行输入和输出操作以及对文件进行读写管理的过程。在C语言中,通过文件操作我们可以实现对磁盘上的文件进行读写操作,以及对文件进行打开、关闭、创建和删除等管理操作。 文件操作在C语言中是通过标准库中的文件操作函数来实现的,这些函数包括fopen、fclose、fread、fwrite、fgets、fputs、fseek等。这些函数提供了一系列的接口来实现对文件的读写操作。 首先,我们需要通过fopen函数来打开文件。fopen函数的原型为:FILE *fopen(const char *filename, const char *mode)。其中filename是要打开的文件名,mode是打开方式。mode参数有以下几种:-"r":只读方式打开,文件不存在则打开失败。 -"w":写入方式打开,文件不存在则创建,若文件存在则清空原有内容。 -"a":追加方式打开,文件不存在则创建,若文件存在则在文件末尾追加内容。 - "rb"、"wb"、"ab":二进制方式读写文件,同上。 fopen函数返回一个指向FILE结构类型的指针,即文件指针,用于后续对文件的操作。 打开文件后,我们可以使用fread函数和fwrite函数来进行文件的读取和写入操作。fread函数的原型为:size_t fread(void *ptr, size_t size, size_t count, FILE *stream);fwrite函数的原型为:size_t fwrite(const void *ptr, size_t size, size_t count, FILE

C语言实验报告之指针结构体等综合程序设计

C语言实验报告之指针结构体等综合程序设计 实验目的: 1.掌握C语言中指针和结构体的基本概念和用法; 2.综合运用指针和结构体,设计和实现一个复杂的程序。 实验内容: 设计一个简单的图书管理系统,实现如下功能: 1.添加图书:输入图书的名称、作者、出版社和价格,将图书信息保存到图书库中; 3.修改图书价格:输入图书的名称,通过遍历图书库,找到要修改的图书,然后输入新的价格; 4.删除图书:输入图书的名称,通过遍历图书库,找到要删除的图书并删除; 5.显示所有图书:输出图书库中所有图书的信息。 实验步骤: 1. 定义一个结构体类型Book,包含图书的名称、作者、出版社和价格; 2. 声明一个指向Book结构体的指针bookPtr,用于操作图书库; 3. 实现添加图书的函数addBook(,从控制台输入图书信息,将其保存到图书库中;

5. 实现修改图书价格的函数changePrice(,从控制台输入要修改的 图书的名称和新的价格,通过遍历图书库找到要修改的图书并更新价格; 6. 实现删除图书的函数deleteBook(,从控制台输入要删除的图书 的名称,通过遍历图书库找到要删除的图书并删除; 7. 实现显示所有图书的函数displayBooks(,遍历图书库输出所有 图书的信息; 8. 定义主函数main(,在主函数中使用以上函数完成图书管理系统 的交互操作; 9.运行程序,测试图书管理系统的各项功能是否正常; 10.编写实验报告,总结实验过程和实验结果。 实验结果: 经过测试,图书管理系统的各项功能正常运行,可以成功添加、查找、修改和删除图书,同时可以显示图书库中所有图书的信息。 实验总结: 通过本次实验,我进一步学习和掌握了C语言中指针和结构体的基本 概念和用法。通过设计和实现图书管理系统这个复杂的程序,我综合运用 了指针和结构体,提高了编程能力,并加深了对C语言的理解。实验中还 遇到了一些问题,比如如何正确遍历图书库、如何确保输入的图书名称不 重复等,通过分析和思考,我逐渐找到了解决问题的方法。通过本次实验,我不仅巩固了已有知识,也提升了解决问题的能力,对于今后的学习和实 际应用有很大的帮助。

C语言程序设计教学大纲

《C语言程序设计》课程教学大纲 一、课程简介 C语言作为一种基础的教学和应用计算机语言,其特点十分鲜明。本课程需要学习者掌握C语言的基本知识和程序设计方法,培养计算机程序设计的基本能力,为学习面向对象的计算机语言打下基础,为后续专业课程的学习打下基础。 二、课程性质与目的 本课程性质为专业必修课。 本课程学习的目的掌握面向过程程序设计语言的基本知识和程序设计方法,培养计算机程序设计的基本能力,为学习面向对象的计算机语言打下基础,为后续专业课程的学习打下基础。 三、教学内容与学时分配 第一章概述(3学时+2学时) 1、教学内容 C语言起源和发展 C语言的特点 简单C程序介绍 C程序的上机步骤 2、教学要求了解C语言的发展过程及特点,熟悉C程序结构,掌握C程序的上机步骤。 3、重点 C程序的上机步骤 4、难点 C语言的程序结构 第二章算法(6学时+2学时) 1、教学内容 算法的概念 算法的表示方法 结构化程序设计方法 2、教学要求了解算法的概念,掌握算法的表示方法和结构化程序设计方法。 3、重点结构化程序设计方法 4、难点算法的表示方法 第三章数据类型、运算符与表达式(3学时+2学时) 1、教学内容 C语言的基本元素 C语言的数据类型 C语言的运算符和表达式

2、教学要求掌握C的数据类型、运算符即表达式。 3、教学重点 C语言的数据类型、运算符和表达式 4、教学难点 C的表达式 第四章顺序结构程序设计(3学时+2学时) 1、教学内容 C语句 标准输入输出函数 顺序结构程序设计举例 2、教学要求掌握C语句和标准输入输出函数、顺序结构程序设计。 3、教学重点 C语句的使用 4、教学难点 C语言的使用 第五章选择结构程序设计(3学时+2学时) 1、教学内容 关系运算符和关系表达式 逻辑运算符和逻辑表达式 if语句 switch语句 选择结构程序设计举例 2、教学要求掌握关系、逻辑运算符及对应的表达式,if语句、switch语句,选择结构 程序设计 3、教学重点 if语句 switch语句选择结构程序设计 4、教学难点选择结构程序设计 第六章循环结构程序设计(6学时+2学时) 1、教学内容 概述 goto语句以及用goto语句构成循环 while语句 do-while语句 for语句 break语句和continue语句 循环的嵌套 循环结构程序设计举例 2、教学要求掌握几种循环语句的使用,掌握循环结钩程序设计 3、教学重点几种循环语句循环结构程序设计 4、教学难点循环结构程序设计 第七章数组(6学时+4学时) 1、教学内容 一维数组的定义和引用 二维数组的定义和引用 字符数组

C语言程序设计实验》__实验指导书

实验指导书 院系:机电工程学院专业: 课程:C语言程序设计编者:丁潇

目录 实验一 C程序的运行环境及简单C程序设计.......... 错误!未定义书签。实验二分支结构程序设计.......................... 错误!未定义书签。实验三循环结构程序设计.......................... 错误!未定义书签。实验四数组程序设计.............................. 错误!未定义书签。实验五函数的使用方法............................ 错误!未定义书签。实验六指针的使用方法............................ 错误!未定义书签。

实验一 C程序的运行环境及简单C程序设计 一、实验目的: 1、了解Visual C++、Turbo C集成环境,掌握常用的菜单命令和相应的功能。 2、掌握C程序的编辑方法,学会编译、连接和运行等操作步骤。 3、逐步掌握根据编译连接的提示信息和运行后用户屏幕输出来修改程序的技巧; 4、掌握数据类型,尤其是基本的数据类型; 5、理解变量与常量,懂得其存储结构; 6、掌握表达式的构成及运算; 7、掌握运算符的种类及运算方法,理解运算符的优先级及结合性; 8、掌握不同类型的数据相互转换的规律; 9、掌握赋值语句的使用方法; 10、熟练掌握输入输出函数; 11、了解简单的编程方法。 二、实验条件: Windows环境,VisualC++6.0、Turbo C2.0。 三、实验要求: 1、通过上机实验,能了解Visual C++、Turbo C集成环境,初步掌握关于文件、编辑、编译、运行和窗口等方面的命令及相应功能,并能在C程序上机操作中使用这些命令。 2、通过C程序上机操作,能完整地认识和掌握程序的编辑、编译、连接和运行等步骤。 3、在实验中学会阅读有关信息,特别是编译连接的出错信息,学会对程序运行后用户屏幕输出数据(包括格式)对错优劣的评价,然后进一步修改源程序,直至完全正确。 4、本次实验至少要能独立地完整地实现一个C程序的正确运行。

《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)难点:算法概念和对结构化步伐设计思想的理解。 第三章数据类型、运算符与表达式 1.教学内容 (1)基本数据类型及其常量的表示法(字符和字符串常量),各种数制(八、十、十六进制)的整型数和长整型数,实型数(float和double); (2)变量的类型说明、初始化及引用; (3)运算符与表达式: 2.重、难点提示

《c语言程序设计》教学大纲

《C语言程序设计》教学大纲 课程名称:中文名称:C语言程序设计;英文名称:C Language Programming 课程编码:161002 学分:4.5分 总学时:72学时,其中,理论学时:52学时;上机学时:20学时。 适用专业:全校理工科各专业 先修课程:计算机基础 执笔人: 审订人: 一、课程的性质与任务 《C语言程序设计》是为全校所有的理工科专业的学生开设的公共基础课,也是一门重要的必修课。其目的是使学生掌握程序设计的基本方法,培养学生掌握利用计算机处理问题的思维方法与应用能力。要求学生掌握程序的三种基本结构及结构化的程序设计方法,了解并掌握几种典型的算法,并且能够熟练地运用C语言编写各种应用程序,为进一步学习其它相关课程奠定基础。 二、教学内容与学时分配 第一章程序设计基本概念(3

学时) 本章重点:一、算法及特性;二、结构化程序设计方法。难点:算法设计及其表示。 第一节程序和程序设计 一、程序;二、程序设计。 第二节算法 第三节结构化程序设计方法 第四节C语言程序的基本结构 第二章数据类型、运算符和表达式(5学时) 本章重点:一、标识符的正确使用;二、各种基本数据类型的使用;三、算术运算符的优先级和结合性;四、表达式计算中的类型转换。难点:一、各种类型数据在计算机内存中的存储形式;二、自增自减运算。 第一节C语言的数据类型 第二节常量与变量 第三节整型数据 第四节实型数据

第五节字符型数据 第六节算术运算符与算术表达式 第七节赋值运算符与赋值表达式 一、赋值运算符和赋值表达式;二、复合的赋值表达式;三、自加、自减运算符; 四、赋值运算中的类型转换。 第八节逗号运算符与逗号表达式 第三章顺序结构程序设计(4学时)本章重点:一、printf函数;二、scanf函数。难点:输入与输出时的格式控制。 第一节C语句概述 第二节赋值语句 第三节数据的输入与输出 一、printf函数;二、putchar函数;三、scanf函数;四、getchar函数 第四节顺序结构程序举例 第四章选择结构程序设计(4学时) 本章重点:一、逻辑值的表示、使用及其运算;二、关系运算符的运算规则及关系表

相关主题
文本预览
相关文档 最新文档