第七章 指 针

第七章 指 针
第七章 指 针

第七章指针

7.5 设有如下声明

int ival = 1024, *iptr;

float *fptr;

判断下列运算的合法性,并说明理由。

7.10 下述程序执行后,输出结果是什么?

#include

char *p[2][3]={ "abc","defgh","ijkl","mnopqr","stuvw","xyz"};

main(){

printf("%c\n",***(p+1));

printf("%c\n",**p[0]);

printf("%c\n",(*(*(p+1)+1))[4]);

printf("%c\n",*(p[1][2]+2));

printf("%s\n",**(p+1));

参考答案:

m

a

w

z

mnopqr

7.13 编写比较两个字符串s1、s2大小的程序。当s1>s2时,输出1;当s1

参考答案:

#include "stdio.h"

int str_cmp(char* str1,char* str2){

while (*str1!='\0'&&*str2!='\0'){

if (*str1>*str2)

return 1;

else if (*str1<*str2)

return -1;

str1++;

str2++;

};

if (*str1=='\0'&&*str2=='\0')

return 0;

else if (*str1!='\0')

return 1;

else return -1;

}

void main(){

char s1[100],s2[100];

printf("please input the first string:");

scanf("%s",s1);

printf("\n");

printf("please input the second string:");

scanf("%s",s2);

printf("\n");

printf("the result is: %d",str_cmp(s1,s2));

printf("\n");

}

7.16 编程序insert(char *s1;char *s2;int v),在字符串s1的第v个字符处插入字符串s2。参考答案:

#include "stdio.h"

int insert(char * s1,char *s2,int v){

char *p1,*p2;

char *q1;

p1=s1;

p2=s2;

int n1=0,n2=0;

int i;

int tt=0;

while (*(s1+n1)!='\0')

n1++;

while (*(s2+n2)!='\0')

n2++;

if (n1+n2>100) {

printf("sorry,you input too long string and input again!");

return 1;

}

p1=s1+v-1;

q1=s1+v-1+n2;

for (i=n1-v+1;i>=0;i--) {

*(q1+i)=*(p1+i);

}

p2=s2;

for (i=0;i

*(p1+i)=*(p2+i);

}

*(s1+n1+n2)='\0';

printf("the result is : %s\n",s1);

return 0;

}

void main(){

int v;

char str1[100];

char str2[100];

int flag=1;

do {

printf("please input the first string s1:");

scanf("%s",str1);

printf("\n");

printf("please input the second string s2:");

scanf("%s",str2);

printf("\n");

printf("please input the insert place:");

scanf("%d",&v);

printf("\n");

}while (insert(str1,str2,v));

}

7.18 编程序str_delete(char *s;int v,w),从字符串s的第v个字符开始删除w个字符。

参考答案:

#include "stdio.h"

char * str_delete(char *s,int v,int w){

char *p,*q;

p=s+v-1;

q=s+v+w-1;

do{

*(p++)=*(q++);

}while (*q!='\0');

*p='\0';

return (s);

}

void main(){

char str[100];

int v,w;

printf("please input a string:");

scanf("%s",str);

printf("please input two integers:");

scanf("%d%d",&v,&w);

printf("\n");

printf("the result is : %s\n",str_delete(str,v,w));

}

7.19 编程序,用指针作参数,实现把字符串str反向。参考答案:

实现字符串反向的reverse函数:

参考答案一

char* reverse(char *str){ char*head,*tail;

char temp;

head=tail=str;

while(*tail!='\0')

tail++;

tail--;

while(tail>head){

temp=*tail;

*tail=*head;

*head=temp;

tail--; head++;

}

return str;

}

char* reverse(char str[ ]){ char*head,*tail;

char temp;

head=tail=str;

while(*tail!='\0')

tail++;

tail--;

while(tail>head){

temp=*tail;

*tail=*head; *head=temp; tail--; head++;

}

return str; }

进行调用的主函数

#include "stdio.h"

void main(){

char sp[ ]="abcde";

printf("%s\n",reverse(sp)); } #include "stdio.h"

void main(){

char sp[ ]="abcde",

char *string=sp;

printf("%s\n",reverse(string)); }

7.24 编程序,输入一个字符串,如

123bc456 d7890*12///234ghjj987

把字符串中连续数字合并,作为整数存入int类型数组中,并输出。参考答案:

#include "stdio.h"

#define intLen 100

#define charLen 1000

void main(){

char str[charLen],*s=str;

int array[intLen],pos=0,i;

do{

*(s++)=getchar();

}while(*(s-1)!='\n');

*s='\0';

for(i=0;i

array[i]=0;

s=str-1;

while(*(++s)!='\0'){

if (*s<='9'&&*s>='0')

array[pos]=(*s-'0')+array[pos]*10;

else

if((*s>='9'||*s<='0')&&(*(s-1)<='9'&&*(s-1)>='0'))

pos++;

}

for(i=0;i

printf("%d\n",array[i]);

}

7.30编程序。建立一个学生姓名的序列。用字符数组来保存每个学生的姓名,要求在程序运行时能够随意增加学生姓名的记录;同时要求此序列能够按照姓名的字母顺序排列打印出来。参考答案:

#include "stdio.h"

void str_add(char *s[],char *q,int n); //增加一个名字

void str_delete(char *s[],int n,int de_num); //删除一个名字

void str_output(char *s[],int n); //按字母顺序输出名单

int str_cmp(char *str1,char *str2); //比较字符串大小

void main(){

char *name[100]={"peter","john","nancy"};

char tt[100];

int n=3,i;

int de_num;

int ch=0;

for (i=0;i

printf("%s\n",name[i]); //输出初始名单

printf("please choose which option do you want :\n");

printf("0:output the current name list ;\n");

printf("1:add a name ;\n");

printf("2:delete a name\n");

scanf("%d",&ch);

switch (ch){

case 0:str_output(name,n);

break;

case 1:printf("please input a name :\n");

scanf("%s",tt);

str_add(name,tt,n); //添加

n++;

break;

case 2:printf("please input the number of the deleting_name:\n");

scanf("%d",&de_num);

str_delete(name,n,de_num); //删除

n--;

break;

}

}

void str_add(char *s[],char *q,int n){

int i;

if (n>=100)

return;

s[n]=q;

n++;

printf("after adding:\n");

for (i=0;i

printf("%s\n",s[i]);

}

void str_delete(char *s[],int n,int de_num){ int i=de_num;

if (i>n)

return;

while (i

s[i]=s[i+1];

i++;

}

s[n-1]=NULL;

n--;

printf("after deleting:\n");

for (i=0;i

printf("%s\n",s[i]);

}

void str_output(char *s[],int n){

int i,j,k;

char *temp;

for (i=0;i

k=i;

for (j=i+1;j

if (str_cmp(s[k],s[j])>0)

k=j;

temp=s[i];

s[i]=s[k];

s[k]=temp;

}

for (i=0;i

printf("%s\n",s[i]);

}

int str_cmp(char *str1,char *str2){

do{

if (*str1>*str2)

return 1;

else if (*str1<*str2)

return -1;

}while (*(str1++)!='\0'&&*(str2++)!='\0');

if (*str1=='\0')

return 1;

else return -1;

}

第五章指针 习题解答

习题解答 第五章指针 1、指针的基类型定义了该指针所指向变量的类型。从技术上讲,任何类型的指针均可指向内存中的任何位置,但因所有的指针运算都是与它的基类型相关联的,所以正确说明指针非常重要。 (1)基类型使指针只能指向基类型定义的一类变量。 (2)限制引用操作满足基类型的约束(范围、运算、内存表示)。 (3)限制指针移动操作的跨度。 2、(1)通过指针引用数组元素是C语言提供的一种高效数组访问机制,通过带下标的指针变量引用一维数组元素。 (2)通过指针指向数组或数组元素的地址完成各种赋值、引用、移动、比较等操作。 数组名在C语言中被处理成一个地址常量,也就是数组所占连续存储单元的起始地址,一旦定义,数组名永远是数组的首地址,在其生存期不会改变。可以通过数组首地址引用数组元素,输出数组中全部元素。也可以将数组名与数组指针赋值完成各种操作。 3、(1)指针数组定义形式为int * a[size];实质是一个数组,共有size个元素,其中每个元素都是指针类型的,并且每个元素的基类型是整型。 (2)数组指针定义形式为int (*p)[size];实质是一个变量,是一个指针变量,这个指针变量的基类型是size 个int类型元素的数组。 简单的说数组指针是一个指针,它指向一个数组,通过这个指针可以对数组进行多种操作,和使用数组下标起到相同的作用,这个指针最初指向数组第一个元素;指针数组就是一个数组,它里边的元素都是指针。举例如下: int *p[5]; // 指针数组,p是数组名,数组里放5个int指针。 int (*p)[5]; // 数组指针,p是指针名,指向一个有5个int元素的数组。 4、(1)int *p;//定义了一个基类型为整型的指针变量p即p是整型指针。 (2)int *p[5];//定义了一个指针数组p,数组中含有5个基类型为整型的指针,即p 是5个元素的数组,数组元素是整型指针。 (3)int (*p)[5]; 定义了一个数组指针p,p指向一个含有5个整型元素的数组,即p 是指针,指向数组,数组有5个整型元素。 (4)int *fp();定义了一个函数fp,函数的返回值是个指向整型变量的指针变量。(5)int (*fp)(); 定义一个指向函数的指针变量fp,返回值为整型。 (6)int * (*fp)(); fp是指针,指向返回类型为整型指针的函数。 (7)void *fp();fp是函数,函数返回通用指针。 (8)int **p;定义了一个指向指针的指针p,p为整型指针的指针,即p是指针,指向一个整型指针。 5、(1)1 2 3 4 5 6 7 8 9 10 11 12 (2)11,11,11

计算机第五章答案

计算机第五章答案

1、PowerPoint 2003主窗口水平滚动条的左侧有三个显示方式切换按钮:“普通视图”、“幻灯片放映”和( ) 。 A. 全屏显示 B.主控文档 C.幻灯片浏览视图 D.文本视图 [] 教师批改:C 2、在以下中,不能进行文字编辑与格式化。 A.幻灯片视图 B.大纲视图 C.幻灯片浏览视图 D.普通视图 [] 教师批改:C 3、在大纲视图窗格中输入演示文稿的标题时,可以( ) 在幻灯片的大标题后面输入小标题。A.单击工具栏中的“升级”按钮 B.单击工具栏中的“降级”按钮 C.单击工具栏中的“上移”按钮 D.单击工具兰中的“下移”按钮 [] 教师批改:B 4、在当前演示文稿中要删除一张幻灯片,采用( ) 方式是错误的。 A.在幻灯片视图,选择要删除的幻灯片,单击“文件|删除幻灯片”命令 B.在幻灯片浏览视图,选中要删除的幻灯片,按Del 键 C.在大纲视图,选中要删除的幻灯片,按Del键

D.在幻灯片视图,选择要删除的幻灯片,单击“编辑|剪切”命令 [] 教师批改:D 5、对于知道如何建立一新演示文稿内容但不知道如何使其美观的使用者来说,在PowerPoint 2003启动后应选择( ) 。A.内容提示向导B.模板 C.空白演示文稿 D.打开已有的演示文稿 [] 教师批改:B 6、以下( ) 不是Powerpoint2003的视图方式A.页面视图 B.普通视图 C.幻灯片浏览视图 D.大纲视图 [] 教师批改:A 7、PowerPoint 演示文稿文件的扩展名是( ) 。 A.DOC B.PPT C.BMP D.XLS [] 教师批改:B 8、下列各项中( ) 不能控制幻灯片外观一致的方法。 A.母板 B.模板 C.背景 D.幻灯片视图 [] 教师批改:D 9、以下( ) 是无法打印出来的。A.幻灯片中的

STEP7——ANY指针详解

参数类型ANY的格式 STEP 7以10个字节存储参数类型ANY。当构造类型为ANY的参数时,必须确保所有10个字节都被占用,因为调用块估计参数整个内容的值。例如,如果以字节4指定DB编号,也必须以字节6明确地指定存储器区。 STEP 7管理基本和复杂数据类型的数据与参数类型的数据不同。 数据类型的ANY格式 对于基本和复杂数据类型,STEP 7存储下列数据: ?数据类型 ?重复因子 ?DB编号 ?信息存储的存储区域 ?数据的起始地址 重复因子识别由参数类型ANY传送的指示数据类型的数量。这意味着可以指定数据区,也可以和参数类型ANY结合使用数组和结构。STEP 7将数组和结构识别为数据类型的编号(借助重复因数)。例如,如果要传送10个字,必须为重复因子输入数值10,并且必须为数据类型输入数值04。 地址以格式Byte.Bit存储,此处字节寻址存储在字节7的位0 - 2,节字8的位0 - 7,节字9的位3 - 7。位地址存储在字节9的位0 - 2。 对于类型NIL的空指针,所有来自字节1的字节设置为0。 下表给出参数类型ANY的数据类型或存储区域的编码。

参数类型的ANY格式 对于参数类型,STEP 7存储数据类型和参数的地址。重复因子始终是1。字节4、5和7始终是0。字节8和9指示定时器、计数器或块的编号。

下表为参数类型显示参数类型ANY的数据类型编码。 使用参数类型ANY 可以为适合于任何数据类型的实际参数的块定义形式参数。当调用块是未知或可以改变时(和当允许任何数据类型时),已提供了实际参数的数据类型时,这尤其有用。在块的变量声明中,可以声明参数为数据类型ANY。然后可以在STEP 7中分配任何数据类型的实际参数。 STEP 7为ANY数据类型的变量分配存储器的80个位。如果分配实际参数给此形式参数,STEP 7在80个位中编码起始地址、数据类型和实际参数的长度。调用块为ANY参数分析保存数据的80个位,并获取进一步处理所需的信息。 分配实际参数给ANY参数 如果为参数声明数据类型ANY,可以分配任何数据类型的实际参数给形式参数。在STEP 7中,可以指定下列数据类型为实际参数: ?基本数据类型:指定实际参数的绝对地址或符号名称。 ?复杂数据类型:指定复杂数据类型的数据符号名称(例如,数组和结构)。 ?定时器、计数器和块:指定编号(例如,T1、C20或FB6)。 ?下图说明数据如何传送到具有ANY数据类型参数的FC。

第七章字符数组与指针练习题参考答案(2)

第七章字符数组与字符串 【题7.29】下面是对s的初始化,其中不正确的是。 A)char s[5]={“abc”};B)char s[5]={‘a’,‘b’,‘c’}; C)char s[5]=“”;D)char s[5]=“abcdef”; 【题7.30】下面程序段的运行结果是。 char c[5]={‘a’,‘b’,‘\0’,‘c’,‘\0’}; printf(“%s”,c); A)‘a’‘b’ B)ab C)ab c 【题7.31】对两个数组a和b进行如下初始化 char a[]=“ABCDEF”; char b[]={‘A’, ‘B’,‘C’,‘D’,‘E’,‘F’}; 则以下叙述正确的是。 A)a与b数组完全相同B)a与b长度相同 C)a和b中都存放字符串D)a数组比b数组长度长 提示:‘\0’是字符串结束的标志 【题7.32】有两个字符数组a、b,则以下正确的输入格式是。 A)gets(a,b); B)scanf(“%s %s”,a,b); C)scanf(“%s %s”,&a,&b);D)gets(“a”),get(“b”); 【题7.33】有字符数组a[80]和b[80],则正确的输出形式是。 A)puts(a,b); B)printf(“%s %s”,a[],b[]); C)putchar(a,b); D)puts(a),puts(b); 【题7.34】下面程序段的运行结果是。 char a[7]=“abcdef”; char b[4]=“ABC”; strcpy(a,b); printf(“%c”,a[5]); A)空格B)\0 C)e D)f 提示:复制后a[0]=‘A’,a[1]=‘B’,a[2]=‘C’,a[3]=‘\0’, a[4]=‘e’,a[5]=‘f’, a[6]=‘\0’,

07-第7章 指针调整故障处理

目录 第7章指针调整故障处理........................................................................................................ 7-1 7.1 背景知识............................................................................................................................ 7-1 7.1.1 指针调整的机理 ...................................................................................................... 7-1 7.1.2 指针调整的检测上报............................................................................................... 7-2 7.1.3 指针调整的性能事件............................................................................................... 7-3 7.2 常见故障原因..................................................................................................................... 7-4 7.3 故障定位方法与步骤.......................................................................................................... 7-5 7.3.1 常用定位方法.......................................................................................................... 7-5 7.3.2 故障定位步骤.......................................................................................................... 7-5 7.4 分类故障定位与排除.......................................................................................................... 7-9 7.4.1 检查时钟配置数据................................................................................................... 7-9 7.4.2 检查环境温度.......................................................................................................... 7-9 7.4.3 检查设备对接的同步情况........................................................................................ 7-9 7.4.4 检查光纤连接........................................................................................................ 7-10 7.4.5 检查外部时钟质量................................................................................................. 7-10 7.4.6 检查网元硬件故障................................................................................................. 7-10

【实验指导书】实验7:指针 (1)

(2014~2015学年-第1学期) 1. 理解指针、地址和数组间的关系。 2. 掌握通过指针操作数组元素的方法; 3. 掌握数组名作为函数参数的编程方式。 4. 掌握通过指针操作字符串的方法。 5. 了解掌握使用断点调试程序的方法。 二、实验环境: 操作系统:Window 8 编译环境:CodeBlock 13.02 三、实验要求及内容(根据实验要求,将整个实验过程需要的数据和截屏记录于此,并整理成实验步骤。): 1.设计一个程序计算输入的两个数的和与差,要求自定义一个函数sum_diff(float op1,float op2,float *psum,float *pdiff),其中op1和op2是输入的两个数,*psum和*pdiff是计算得出的和与差。 解: (1)流程图如图1所示: 图1 程序7-1的流程图

图2 实验7-1实验源代码 (3)运行结果(测试用例) 实验7-1运行结果如图3所示 图3 实验7-1运行结果 2. 输入n 个正整数,使用选择法将它们从小到大排序后输出。要求:利用所学指针的内容实现。 提示:在指针这一章所学的冒泡排序算法基础上改写。 解: (1)流程图如图1所示: 图1 程序7-2的流程图

图2 实验7-2实验源代码(3)运行结果(测试用例)实验7-2运行结果如图3所示 图3 实验7-2运行结果

3. 输入10个整数存入数组a ,再输入一个整数x ,在数组a 中查找x ,若找到则输出相应的下标,否则显示“Not found ”。要求定义和调用函数seach(int list[],int n ,int x),在数组list 中查找元素x ,若找到则返回相应的下标,否则返回-1,参数n 代表数组list 中元素的数量。试编写相应程序。 解:(1)流程图如图1 7-3的流程图 (2)源代码 源代码如图2所示

实验7 指针习题及参考答案

上机实验十指针 一.目的要求 1.掌握指针的基本概念; 2.掌握指针变量的定义和初始化; 3.掌握用下标、数组名或指针等不同方式引用数组元素; 4.掌握数组名作函数参数的方法; 5.请添加签名,本实验均用指针方法处理。 二.实验内容 【实验题1】 1)程序填空,交换指针p1,p2所指向的变量。(10 分) # include void main ( ) { int a=1,b=2, *p1, *p2, pt; p1=&a; p2=&b; printf(“*p1=%d, *p2=%d \n”, *p1,*p2); pt=p1 ; p1=p2 ; p2=pt ;//交换指针变量p1,p2所指向的变量printf(“*p1=%d, *p2=%d \n”,*p1,*p2); } 运行结果: 2)程序填空,交换指针p1,p2所指变量的值。 # include void main ( ) { int a=1,b=2, *p1, *p2, temp; p1=&a; p2=&b; printf(“*p1=%d, *p2=%d \n”, *p1,*p2); temp=*p1 ; *p1=*p2 ; *p2=temp ;///交换指针p1,p2所指变量的值 printf(“*p1=%d, *p2=%d \n”, *p1,*p2); } 运行结果: 【实验题2】程序填空:输入三个整型变量i,j,k的值。请设置三个指针变量p1,p2,p3,分别指向i,j,k。

然后通过p1,p2,p3使i,j,k三个变量的值依次交换,即原来i的值赋给j, 原来j的值赋给k, 原来k的值赋给i。输出交换后i,j,k的值。(10 分) i j k 分析:三个值轮换跟两个值互换是一样的原理,在变量被赋新值之前必须保证原值已经被保存。设temp 为临时变量,则temp=i; i=k; k=j; j=temp ,参考以上做法,轮换时要求用指针p1,p2,p3来替代i,j,k. 源程序: #include void main ( ) { int i,j,k,temp, *p1=&i ,*p2=&j,*p3= &k ; printf("Input i j k: "); scanf("%d%d%d",&i,&j,&k); //输入i j k //i-->j-->k-->i temp=*p1 ; *p1=*p3 ; *p3=*p2 ; *p2= temp; printf("%d %d %d \n", *p1,*p2, *p3);//输出轮换后的i j k } 输入:1 2 3 输出: 【实验题3】程序填空:输入三个整数,要求设计2个指针变量p1,p2 ,使p1指向这三个数的最大值,p2指向最小者 ,并输出最大值和最小值。(10 分) # include void main ( ) { int a,b,c, *p1, *p2, *p3; scanf(“%d%d%d”,&a,&b,&c); // 令p1指向最大值 p1=(a>b)?&a:&b ; //p1指向a,b中较大者 if(*p1c ) p2=&c; printf(“max=%d, min=%d”, *p1,*p2 ); printf("Hello,c\n" ); }

第五章习题及答案讲解学习

第五章习题及答案

第五章设备管理 1.试说明设备控制器的组成。 答:由设备控制器与处理机的接口,设备控制器与设备的接口与I/O逻辑组成。 2.为了实现CPU与设备控制器间的通信,设备控制器应具备哪些功能? 答:接收和识别命令;数据交换;标识和报告设备状态;地址识别;数据缓冲;差错控制。 3.什么是字节多路通道?什么是数组选择通道和数组多路通道? 答:(1)字节多路通道。按字节交叉方式工作的通道。通常含有许多非分配型子通道,数量从几十到数百个,每个子通道连接一台I/O 设备,控制其I/O 操作。子通道按时间片轮转方式共享主通道。 (2)数组选择通道。按数组方式传送数据,传输速率很高,每次只允许一个设备数据。 (3)数组多路通道。将数组选择通道传输速率高和字节多路通道的各子通道分时并行操作的优点结合而成。含有多个非分配型子通道,具有很高的数据传输率和通道利用率。 4.如何解决因通道不足而产生的瓶颈问题? 答:解决问题的有效方法是增加设备到主机间的通路而不增加通道,把一个设备连到多个控制器上,控制器又连到多个通道上,这种多通路方式解决了“瓶颈”问题,提高了系统可靠性,个别通道或控制器的故障不会使设备和存储器之间没有通路。 5.试对VESA 及PCI两种总线进行比较。 答:VESA总线的设计思想是以低价占领市场。总线带宽32位,最高传输速率 132Mb/s。广泛用于486微机。缺点是能连接的设备数仅为2~4 台,控制器中无缓冲,难于适应处理器速度的提高,不支持Pentium机。

PCI总线在CPU和外设间插入了复杂的管理层,协调数据传输和提供一致接口。管理层中配有数据缓冲,放大了线路的驱动能力,最多支持10种外设,支持高时钟频率的CPU 运行,最大传输速率132Mb/s。可连接ISA、EISA 等传统总线,又支持Pentium的64位系统,是基于奔腾等新一代微处理器而发展的总线。 6.试说明推动I/O控制发展的主要因素是什么? 答:推动I/O 控制发展的主要动力在于尽量减少主机对I/O 控制的干预,把主机从繁杂的I/O控制事务中解脱出来,用更多的时间和精力去完成其数据处理任务。同时,中断机制在计算机系统中的引入、DMA 控制器的出现和通道研制的成功使I/O 控制的发展具备了技术支持和成为可能。 7.有哪几种I/O控制方式?各适用于何种场合? 答:共有四种I/O 控制方式。 (1)程序I/O 方式:早期计算机无中断机构,处理机对I/O设备的控制采用程序I/O方式或称忙等的方式。 (2)中断驱动I/O 控制方式:适用于有中断机构的计算机系统中。 (3)直接存储器访问(DMA)I/O 控制方式:适用于具有DMA控制器的计算机系统中。 (4)I/O 通道控制方式:具有通道程序的计算机系统中。 8.试说明DMA 的工作流程。 答:以从磁盘读入数据为例,说明DMA的工作流程。当CPU要从磁盘读入数据块时,先向磁盘控制器发送一条读命令。该命令被送到命令寄存器CR中。同时还发送本次要读入数据的内存起始目标地址,送入内存地址寄存器MAR;本次要读数据的字节数送入数据计数器DC,将磁盘中的源地址直接送DMA控制器的I/O 控制逻辑上。然后启动DMA 控制器传送数据,以后CPU 便处理其它任务。整个数据传送过程由DMA控制器控制。下图为DMA方式的工作流程图。

第7章 指针和指针变量

第七章指针 知识目标: ●理解指针和指针变量的概念 ●掌握指针变量的定义与应用 ●理解指针与数组名之间的关系 ●掌握指针与数组的综合应用 ●掌握指针与字符串处理的设计方法 ●了解指针在函数中的应用 能力目标: ●理解指针的作用 ●会通过指针类型使函数返回多个值 ●会通过指针访问数组元素 ●会使用指针作为数组的形参、实参 ●会通过指针访问字符串元素

7.1 指针的基本概念 指针是C语言中的重要概念,也是C语言的重要特色。使用指针可以有效地表示复杂的数据结构;使用指针可以能方便地使用数组、字符串;使用指针可以使程序更加简洁、紧凑、高效。 计算机硬件系统的内存储器中,拥有大量的存储单元(容量为1字节)。为了方便管理,必须为每一个存储单元编号,这个编号就是存储单元的“地址”。每个存储单元都有一个惟一的地址。 变量的实质是计算机给程序分配的一定数量的存储空间,因此变量也有地址,scanf (“%d”,&a)中的&,本质上就是取出a的地址,使得输入的数据根据地址存放到相应的存储空间。 那什么是指针呢?指针其实就是地址,二者同一个概念的两种说法。只不过指针更形象一些,就像一个针一样,可以指向某个地方。 变量的指针就是变量的地址。存放变量地址的变量是指针变量。即在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个变量的地址或称为某变量的指针。 指针与指针变量的关系如图7-1所示。 图7-1 指针与指针变量的关系 有了指针变量,我们访问变量就有了两种方式,直接访问和间接访问。 直接访问:按变量名存取变量值,比如:i=3。 间接访问:通过存放变量地址的变量去访问变量,比如图7-1中,i_pointer中存放了i的地址,我们就可以通过它先读取i的地址找到i变量的位置,然后读取i变量的值。 为了表示指针变量和它所指向的变量之间的关系,在程序中用“*”符号表示“指向”,“*”也叫作指针运算符(去内容运算符),是一个与“&”互为相反的运算符。 例如,i_pointer 代表指针变量,而*i_pointer是i_pointer 所指向的变量。因此,下面两

C语言笔记第五章数组和指针的关系

C语言笔记第五章数组和指针的关系 第五章数组和指针的关系 如果对声明数组的语句不太明白的话,请参阅我前段时间贴出的文章< 理解c和c++的复杂类型声明>>。 数组的数组名其实可以看作一个指针。看下例: 例八: int array[10]={0,1,2,3,4,5,6,7,8,9},value; ... ... value=array[0];//也可写成:value=*array; value=array[3];//也可写成:value=*(array+3); value=array[4];//也可写成:value=*(array+4); 上例中,一般而言数组名array代表数组本身,类型是int [10],但如果把a rray看做指针的话,它指向数组的第0个单元,类型是int *,所指向的类型是数组单元的类型即int。因此*array等于0就一点也不奇怪了。同理,array+3是一个指向数组第3个单元的指针,所以*(array+3)等于3。其它依此类推。 例九: 例九: char *str[3]={ "Hello,this is a sample!", "Hi,good morning.", "Hello world" }; char s[80]; strcpy(s,str[0]);//也可写成strcpy(s,*str); strcpy(s,str[1]);//也可写成strcpy(s,*(str+1)); strcpy(s,str[2]);//也可写成strcpy(s,*(str+2));

上例中,str是一个三单元的数组,该数组的每个单元都是一个指针,这些指 针各指向一个字符串。把指针数组名str当作一个指针的话,它指向数组的第0号单元,它的类型是char**,它指向的类型是char *。 *str也是一个指针,它的类型是char*,它所指向的类型是char,它指向的地 址是字符串"Hello,this is a sample!"的第一个字符的地址,即'H'的地址。 str+1也是一个指针,它指向数组的第1号单元,它的类型是char**,它指向 的类型是char *。 *(str+1)也是一个指针,它的类型是char*,它所指向的类型是char,它指向"Hi,good morning."的第一个字符'H',等等。 下面总结一下数组的数组名的问题。声明了一个数组TYPE array[n],则数组 名称array就有了两重含义:第一,它代表整个数组,它的类型是TYPE [n];第二,它是一个指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区,注意它和数组第0号单元占据的内存区是不同的。该指针的值是不能修改的,即类似array++的表达式是错误的。 在不同的表达式中数组名array可以扮演不同的角色。 在表达式sizeof(array)中,数组名array代表数组本身,故这时sizeof函数 测出的是整个数组的大小。 在表达式*array中,array扮演的是指针,因此这个表达式的结果就是数组第 0号单元的值。sizeof(*array)测出的是数组单元的大小。 表达式array+n(其中n=0,1,2,....。)中,array扮演的是指针,故arr ay+n的结果是一个指针,它的类型是TYPE*,它指向的类型是TYPE,它指向数组第n号单元。故sizeof(array+n)测出的是指针类型的大小。 例十: int array[10]; int (*ptr)[10]; ptr=&array; 上例中ptr是一个指针,它的类型是int (*)[10],他指向的类型是int [10] ,我们用整个数组的首地址来初始化它。在语句ptr=&array中,array代表数组本身。

实验7 指针及其运算

实验七指针及其运算 实验目的 理解指针的概念,会定义和使用指针变量,掌握指针的运算规则,学会使用数组的指针和指向数组的指针变量。 要点提示 1.变量在内存单元的地址称为该变量的“指针”。 2.指针变量是用来存放其它变量地址的变量。 3.指针变量定义的一般形式: 类型标识符*指针变量名; 4.指针运算符 &(取变量地址运算符)和*(取值运算符)是互逆的运算符,右结合。 ++,--,+,- 运算符是按地址计算规则进行的。 5.用指针作为函数参数,可以实现“调用函数改变变量的值,在主调函数中使用这些改变的值。 6.数组的指针是指数组的起始地址(首地址),数组元素的指针是指数组元素的地址。数组名代表数组的首地址,是地址常量。 实验内容 1.指针变量的说明,初始化和使用。 2.指针作为函数参数。 3.数组的指针和指针数组的指针变量的说明和使用 4. 数组名作为函数参数 实验步骤 读懂并输入程序,完成填空后输出结果,(下面程序中的中文注释可以不输入) 1. 输入a和b两个整数,按先大后小的顺序输出。 算法提示:不交换变量的值,而是交换两个指针变量的值,使p1指向较大的数,p2指向较小的数。 #include using namespace std; main() { int *p1,*p2, 【】;/* 变量说明语句*/ int a, b; cout<<"\n Please input a and b:"; cin>>a>>b; p1=&a; p2=&b; if (a

C语言 第7章 指针(答案)

第7章指针 一、选择题 1、变量的指针,其含义是指变量的(B) A)值B)地址C)名D)一个标志 2、若有以下定义: int x[10], *pt=x; 则对x数组元素的正确引用是(B) A) *&x[10] B) *(x+3) C) *(pt+10) D) pt+3 3、若有定义语句:double x[5]={1.0,2.0,3.0,4.0,5.0},*p=x;则错误引用x数组元素的是(B) A)*p B)x[5] C)*(p+1) D)*x 4、设已有定义:float x;则以下对指针变量p进行定义且赋初值的语句中正确的是(D) A)float *p=1024; B)int *p=(float x); C)float p=&x; D)float *p=&x; 5、有以下程序 main(){ int n,*p=NULL; *p=&n; printf(“Input n:”); scanf(“%d”,&p); printf(“output n:”); printf(“%d\n”,p); } 该程序试图通过指针p为变量n读入数据并输出,但程序有多处错误,以下语句正确的是(A) A)int n,*p=NULL; B)*p=&n; C)scanf(“%d”,&p)D)printf(“%d\n”,p); 6、若有说明:int *p,m=5,n;以下正确的程序段是(D) A)p=&n; B)p=&n; scanf(“%d”,&p); scanf(“%d”,*p); C)scanf(“%d”,&n); D)p=&n; *p=n; *p=m; 7、若有语句int * p1, a=4;和p1=&a;下面均代表地址的一组选项是(C) A)a, p1, *&a B)&*a, &a, *p1 C)* &p1, * p1, &a D)&a, &* p1, p1 8、下面程序的输出结果是(D) main(){ int a=25,*p; p=&a; printf("%d\n",++*p); } A)23 B)24 C)25 D)26 9、下列函数的功能是 (A) int fun (char *x){ char *y=x; while(*y++); return(y-x-1);

实验7-指针

《C语言程序设计》实验报告实验序号:7 实验项目:指针 一、实验目的及要求 1、通过实验掌握指针的定义和使用指针变量; 2、掌握使用指针对数组和字符串进行操作; 3、掌握函数中指针类型参数的使用; 4、要求采用指针方法完成。 二、实验设备(环境)及要求 使用Turbo C 或Visual C++ 6.0;windows系列操作系统的环境。 三、实验内容与步骤 1.输入运行下面这个程序,观察并分析结果: #include "stdio.h" void main() { int a[]={2,3,4,5,6}; int *p1; char *p2="computer\n"; p1=a; printf("%d\n",p1+2); printf("%d\n",*(p1+2)); p1=a+2; printf("%d\n",p1+2); printf("%d\n",*(p1+2)); printf(p2+2); printf("%s",p2+2); } 运行结果截图:

2.以下程序调用invert 函数按逆序重新放置a 数组中的值,a 数组中的值在main 函数中读入,请填空。 #include "stdio.h" void invert(int *s,int i,int j) { int t; if(i

c++第五章习题解答(新教材)

习题 一、选择题 1. 下列叙述错误的是____A_____。 A. 主函数中定义的变量在整个程序中都是有效的 B. 复合语句中定义的变量只在该复合语句中有效 C. 其它函数中定义的变量在主函数中不能使用 D. 形式参数是局部变量 2. 若函数的形参为一维数组,则下列说法中错误的是____B、才_____。 A. 形参数组可以不指定大小 B. 函数调用时对应的实参只能是数组名 C. 函数调用时,系统会为形参数组分配存储单元 D. 函数中对形参的修改将会影响对应的实参值 3. 若函数的类型和return语句中的表达式的类型不一致,则____D_____。 A. 编译时出错 B. 运行时出现不确定结果 C. 不会出错,且返回值的类型以return语句中表达式的类型为准 D. 不会出错,且返回值的类型以函数类型为准 4. 下面的函数定义正确的是_____D____。 A. float f(float x;float y) B. float f(float x,y) {return x*y;} {return x*y;} C. float f(x,y) D. float f( int x, int y) {int x,y ; return x*y;} {return x*y;} 5. 下面函数头的定义格式正确的是____C_____。 A. void sort(int a[n],int n) B. void sort(int a[ ][ ],int n) C. void sort(int a[ ],int n) D. void sort(int a[ ],n) 6. 下面4个程序中输出结果是125的有____C_D____。 (1). #include "iostream.h" void cube(int x) { x=x*x*x; } void main() { int x=5;cube(x); cout<

第七章力知识点归纳

第七章知识点归纳 第1节力 1、定义:力是物体对物体的作用。符号F 2、单位:N。托起两个鸡蛋所用的力大约1N。 3、条件:①至少要有两个物体②物体间要有相互作用③接触和不接触的物体之间都可能有力的作用 4、作用效果:①力可以改变物体的形状 ②力可以改变物体的运动状态 运动状态改变:①速度大小的改变②运动方向的改变 运动状态不变是指物体处于静止状态,或匀速直线运动状态 5、三要素:力的大小、方向和作用点(受力物体上),它们都能影响力的作用效果。 力的示意图:用一根带箭头的线段把力的三要素表示出来叫做力的三要素。(其中线段的长短表示力的大小,箭头表示力的方向,线段的起点表示力的作用点。) 6、特点:物体间力的作用是相互的。 同一个物体既是施力物体又是受力物体,力不能脱离物体而存在。 相互作用力特点:同时产生,同时消失。两个力大小相等、方向相反、作用在同一直线上,作用在两个不同的物体上。 第2节弹力 1、弹性和塑性 物体受力时发生形变,不受力时又恢复原来的形状的特性叫做弹性。(弹性有一定的限度,超过这个限度就不能完全复原。) 物体受力时发生形变,不受力时不能自动恢复原来形状的特性叫做塑性。 2、弹力:(施力)物体由于发生弹性形变而产生的力。 3、产生的条件:①两物体相互接触②(挤压)并发生弹性形变 4、弹力的大小:与弹性形变的程度有关 方向:与弹性形变的方向相反 作用点:受力物体的接触面上 5、常见的弹力:压力、支持力、拉力、推力等。 6、弹簧测力计原理:在弹性限度内,弹簧的伸长量与所受拉力成正比。 7、弹簧测力计的使用方法: 答:(1)“三看清”:看清测力计的量程、分度值以及指针是否对准零刻线,若不是,应调零。 (2)被测力的大小不能超出量程。 (3)使用前,用手轻轻地来回拉动几次,避免指针、弹簧和外壳之间的摩擦而影响测量的准确性。 (4)使用时,要使弹簧测力计的受力方向与弹簧的轴线方向一致。 (5)读数时,应保持测力计处于静止或匀速直线运动状态。视线必须与刻度面垂直。 第3节重力 1、万有引力:宇宙间任何两个物体之间都存在相互吸引的力。 2、重力定义:由于地球的吸引而使物体受到的力。符号G 施力物体:地球 受力物体:地球附近的所有物体 3、重量:重力的大小。 4、重力大小:物体所受的重力跟它的质量成正比G=mg。 重力大小还与纬度和高度有关,赤道受的重力小于两极的重力。 g= 9.8 N/kg。物理意义为:质量为1 kg 的物体所受到的重力是9.8 N。(在粗略计算时可取g =10 N/kg) 5、重力方向:总是竖直向下。其中“下”是指“指向地心”。 6、重力作用点:重心。形状规则的物体的重心在几何中心。 7、提高物体稳度的方法:①降低物体的重心②增大物体的支撑面积

第5章指针

第5章指针 通过本章实验作业应达目标 1.理解指针变量的含义,掌握使用指针变量的方法。 2.掌握带有指针形参的函数的定义及调用方法。 3.正确使用指针操作数组元素。 4.正确使用指针数组操作字符串。 本章上交作业 程序5_1.c,5_2.c,5_3.c,5_4.c上传至http://121.251.227.27:8080/c。 实验一指针作函数参数 【实验目的】 掌握指针概念及定义方法,学习使用指针间接访问变量。 【实验内容】 编写一个函数void swap(int *x,int *y),其中的 x,y都是指向int的指针,功能是实现x,y所指向的两个int变量的值的交换。并写出函数调用过程。以5_1.c命名本程序并上交。 主函数如下: #include void main( ) { void swap(int *x,int *y); int a,b; scanf("%d,%d",&a,&b); printf("before swap: a=%d,b=%d\n",a,b); 此处请写出函数调用过程; printf("after swap: a=%d,b=%d\n",a,b); } 【实验提示】 注意指针作为函数参数的写法。 实验二用指针访问数组 【实验目的】 学习使用指针间接访问一维数组。 【实验内容】 给定主函数,编写三个函数input()、sort()、output(),分别实现数组元素的输入,

数组元素的排序(升序)和数组元素的输出。请以5_2.c命名本程序并上交。 #include "stdio.h" void main( ) { void input(int *a,int n); void sort(int *a,int n); void output(int *a,int n); int a[10]; input(a,10); sort(a,10); output(a,10); } 【实验提示】 1.可以使用数组那一章讲到的任何一种排序算法。 2.本题关键是指向数组的指针变量的应用。由于将数组的首地址赋给了形参指针变量,所以可以在被调函数对指针变量所指向的地址处值的修改可以实现对主函数中数组 元素值的修改。 【思考】 1. 如果只想对a数组的前5个数排序,该如何调用sort函数? 2. 如果只想对a数组的后5个数排序,该如何调用sort函数? 实验三从数组中删除数据 【实验目的】 学习数组中某一数据的删除操作,深入理解指针做参数间接访问一维数组。 【实验内容】 编写函数int delnum(int *a , int num , int n),用于在长度是n的数组a中,删除一个值为num的元素。删除后数组的长度作为函数的返回值返回。注意,num在数组中可能不只一个。请以5_3.c命名本程序并上交。 主函数如下: # define N 10 void main( ) { int a[N] , num; scanf(“%d”,&num); 输入N个数到数组a中; 调用delnum函数在数组a中删除指定的数num; 输出删除了num后的数组a; } 定义并编写delnum函数 实验四字符串的交叉连接 【实验目的】 学习使用指针间接访问字符串。

相关文档
最新文档