C语言程序设计实验六指针上机报告

更新时间:2023-11-17 08:08:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

语言程序设计》上机报告

实验六 指针程序设计

专业: 电子信息工程 班级: 电信1301 学号: U201313480 姓名: 秦行 完成日期: 2014/5/24

1 《标准C

一、 实验目的

1. 进一步理解指针的概念,掌握指针变量间接地址访问的本质;

2. 掌握利用指向数组的指针变量表示一维数组元素及元素地址的方法; 3. 掌握利用指向二维数组的行指针变量表示二维数组元素及其地址的方法; 4. 掌握字符串的指针和指向字符串的指针变量; 5. 掌握指针数组和二级指针;

6. 熟悉通过动态内存分配实现动态数组,并体会指针在其中的作用。

二、 实验内容及要求(鼓励一题多解)

1. 深入理解《上机实践训练教程》2.6实验六案例示范和有关概念 文字描述中的知识点,给出你的理解。

数组名str实质可以作为首地址,是一个指针,而且还是一个常量指针。 char *str是指针变量,该变量取值为存放字符串的内存单元的第一个字节空间的地址值;

而char str[]定义一个数组,将字符串存放进str数组。str是数组名,代表数组空间的入口地址,作为指针常量

2. 用指向数组的指针编程实现:输入一个字符串,内有数字和非数字符号,如:a123x456 17960?302tab5876。将其中连续的数字作为一个整数,依次存放到一个数组a中。例如:123放在a[0]中,456放在a[1]中……试统计共有多少个整数,并输出这些数。要求添加合适的注释。 #include #include

void main() {

char c[100],*p=c;

int a[50],*q=a,num=0,i;//定义字符数组c和数组a,用p,q分别定义并赋初值 printf(\输入一个字符串,内有数字和非数字符号\ gets(c);//录入字符串 for(;*p!='\\0';p++) { if(*p>='0' && *p<='9') { *q=(*p)-'0';//指针实现c[]到a[]的赋值 p++; if(*p>='0' && *p<='9') *q=(*q)*10+(*(p++)-'0');//将数字字符串变为数字存入 num+=1;//if下的加1 q++; } }

for(i=0,q=a;i

putchar('\\n');

printf(\一共输入了%d个数字。\\n\ }

3. 利用指向指针的二级指针变量对N个字符串按字典顺序排序并输出。(用二维数组保存6个字符串,排序只能使用设标签的选择法和交换法两种) 利用指向指针的二级指针变量对N个整数排序并输出。(二选一) 注:指向指针的指针变量就是二级指针变量,其定义格式为int **pp;或char

#include #include #include #define SIZE 50 #define N 6

void main() {

char str[N][SIZE],temp[SIZE]; char *pstr[N]; char **ppstr=pstr; int i,j,k;

for(i=0;i

printf(\输入6个长度不超过%d的字符串\\n\ for(i=0;i0) { k=j; } } if(k!=i) { strcpy(temp,*(ppstr+k)); strcpy(*(ppstr+k),*(ppstr+i)); strcpy(*(ppstr+i),temp); } }

puts(\按字典顺序输出为:\ for(i=0;i

4. 深入理解内存管理专题中的堆区内存使用和释放规则,在此基础上,找出下

面代码错误的原因,并给出1-2个解决方案(至少有一个方案使用malloc/free或new/delete[])。 #include char *GetString(void) {

char p[ ] = \

return p; // p指针指向哪一类内存空间? }

void main(void) {

char *str = NULL; str = GetString(); cout<< str << endl; }

错误原因及你的理解:

char *GetString(void){}返回的是临时指针变量p。临时变量调用完成后被释放。应将其声明为静态变量或外部变量,或在内存区中给它分配常量空间。

修正方案1:

#include exstern char *p;

char *GetString(void) {

char p[ ] = \

return p; // p指针指向哪一类内存空间? }

void main(void) {

char *str = NULL; str = GetString(); cout<< str << endl; }

修正方案2:

#include #include char *GetString(void) {

char *p;

char *p=(char*)malloc(sizeof(char)*50); char p[ ] = \

return p; // p指针指向哪一类内存空间? }

void main(void) {

char *str = NULL; str = GetString(); cout<< str << endl; }

5. 利用指向指针的指针方法对6个字符串按字典顺序排序并输出。(选做) 要求:1、将6个字符串保存在堆区内存;2、用指针数组+二级指针对6个字符串按字典顺序排序。 #include #include #include #include #define SIZE 50 #define N 6

void main() { char str[N][SIZE],temp[SIZE]; char *pstr[N]; char **ppstr=pstr; char *p=(char *)malloc(sizeof(char)*50); int i,j,k; for(i=0;i0) { k=j; } } if(k!=i) { strcpy(temp,*(ppstr+k)); strcpy(*(ppstr+k),*(ppstr+i)); strcpy(*(ppstr+i),temp); } } puts(\按字典顺序输出为:\

for(i=0;i

6. 编程求一个3×3整数矩阵对角线元素之和。(整数矩阵用二维数组保存,要求用行指针变量访问二维数组)/

注:行指针变量的定义格式为:int (*p)[3];//p可以指向3×3二维数组的每一行整体。

#include #include

void main() {

int str[3][50],*pstr[3]; int i,j,s1,s2; s1=0;s2=0;

printf(\输入矩阵数值:(3*3矩阵)\ for(i=0;i<3;i++) { for(j=0;j<3;j++) scanf(\ pstr[i]=str[i]; }

printf(\矩阵为:\\n\ for(i=0;i<3;i++) { printf(\ }

for(i=0;i<3;i++) { s1+=*(pstr[i]+i); s2+=*(pstr[i]+2-i); }

printf(\矩阵左对角线和为%d,右对角线和为%d\}

7. 调试指针的课后作业

三、 上机中的感受、困惑及教学建议

1、 2、

对报告中的某些概念的理解 课堂某个知识点的困惑

3、 4、 上机调试中问题 …

本文来源:https://www.bwwdw.com/article/l6fv.html

Top