C语言 实验4指针实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验4指针实验
一、实验目的(四号黑体)
(1)通过实验进一步掌握指针的概念,会定义和使用指针变量;
(2)能够正确使用数组的指针和指向数组的指针变量;
(3)能够正确使用字符串的指针和指向字符串的指针变量;
(4)能正确使用指向函数的指针变量。
二、实验原理(算法分析(包括流程图))
1、a是二维数组,p和形参 pointer是指向整型数据的指针变量,P指向数组0行0列元素
a[0][0]。在调用move函数时,将实参p的值&a[0][0]递给形参 pointer,在move函数
中将a[i][j]与a门的值互换。
由于a数组的大小是3×3,而数组元素是按行排列的,因此a[j在a数组中是第(3×i+j)
个元素,例如,a[2[1是数组中第(3×2+1)个元素,即第7个元素(序号从0算起)。a[i[j
的地址是( pointer+3*i+j),同理,a[j][i]的地址是( poInter+3*j+i)。将
*( pointer+3*i+j)和*( pointer+3*j+i)互换,就是将a[i][j]和[i][j]互换
算法如下:
2、当p1所指向的字符比p2大时,t为正数(即,p1所指向的字符的ASC II码,减去p2所指向的字符的ASC II码大于0),当p1所指向的字符比p小大时,为负数,当p1所指向的字符与p2一样大时,t=0;所以实现上诉命令的算法如下:
三、实验过程原始记录(数据、图表、计算等)
1、(1)
本题目要求编程实现矩阵的转置,并且在实现这一操作时只能使用指针,因此解决这一问题时,应注意下面几个问题:
数组名是一个指针变量,但该指针变量是一个常量;
int a[10] 中的a 的类型等同于 int *p 定义的指针变量p;
int a[10][5]中定的a的类型等同于 int (*p)[5];
(2)程序代码如下:
#include
int main()
{
void move(int * pointer);
int a[3][3], * p, i;
printf("输入矩阵:\n");
for (i = 0; i < 3; i++)
scanf_s("%d%d%d", &a[i][0], &a[i][1], &a[i][2]);
p = &a[0][0];
move(p);
printf("转置后:\n");
for (i = 0; i < 3; i++)
printf("%d %d %d\n", a[i][0], a[i][1], a[i][2]);
return 0;
}
void move(int * pointer)
{
int i, j, t;
for (i = 0; i < 3; i++)
for (j = i; j < 3; j++)
{
t = *(pointer + 3 * i + j);
*(pointer + 3 * i + j) = *(pointer + 3 * j + i);
*(pointer + 3 * j + i) = t;
}
}
2、
程序代码如下:
#include "stdio.h"
int main(int argc, char* argv[])
{
int strcmp(char* p1, char* p2);
char s[100], a[100];
printf_s("输入一串字符1: ");
gets_s(a);
printf_s("输入一串字符2: ");
gets_s(s);
printf("%d\n", strcmp(a, s)); return 0; }
int strcmp(char* p1, char* p2)
{
int t;
t = *p1 - *p2;
for (;t == 0 && p1!="0"&&*p2!='0';) {
p1++;
p2++;
t = *p1 - *p2;
}
return t;
}
四、实验结果及分析
1、输入矩阵
结果如下:
2、(1))输入第一个字符串比第二个小
结果如下:
分析:a 的ASCII代码是97,c的是99,所以二者相减t=-2
(2)第一个字符串比第二个大
(3)输入完全相同的字符串
五、附录(自己实现的源代码)
1、
#include
int main()
{
void move(int * pointer);
int a[3][3], * p, i;
printf("输入矩阵:\n");
for (i = 0; i < 3; i++)
scanf_s("%d%d%d", &a[i][0], &a[i][1], &a[i][2]);
p = &a[0][0];
move(p);
printf("转置后:\n");
for (i = 0; i < 3; i++)
printf("%d %d %d\n", a[i][0], a[i][1], a[i][2]);
return 0;
}
void move(int * pointer)
{
int i, j, t;
for (i = 0; i < 3; i++)