一、实验目的:
1、指针基础及指针运算
加强对指针数据类型的理解,熟悉指针的定义,通过指针间接访问变量。
2、字符串反转及字符串连接
加强对字符指针以及将指针作为函数返回类型的理解,并通过指针对字符串进行操作,通常来说,一个字符串在内存中是连续存放的,其开始为指向该字符串的指针值,字符串均以‘\0’作为结束字符。
3、数组元素奇偶排列
加强对使用指针对数组进行操作的理解,通常数组的名称即整个数组的起始存储地址,可以定义一个指针指向它,然后通过指针移动来访问各个数组的成员。
二、使用仪器、器材
微机一台
操作系统:Win7
编程软件:C/C++
- 实验内容及原理
填入自己的内容(思路或算法流程图、源代码、说明等)
想法:
2、字符串的反转及字符串的连接
先输入字符串,用一个指针标记字符串的首位,另一个指针标记字符串的末位,用一个循环,当标记的首位指针比末位指针小才执行循环,首位指针++,末位指针--,然后交换,就可以实现字符串逆置。
用一个字符型指针标记为第一串字符串末位的后一位,让其等于要接的字符串的首位元素,将指针++和要接的字符串++,即能实现字符串拼接。
3、数组元素的奇偶排列
建立一个数组,输入数组元素,用两个指针,一个指针标记为数组的首位,另一个指针标记为数组的末位,两个指针向中间靠拢,当首位指针<末位指针时执行循环,首位的指针指向的元素判断是否为奇数,是奇数则循环继续判断下一位,不是奇数则终止循环,末位指针指向的元素则是判断是否为偶数,原理相同。当首位与末位指针都停止时(即首位遇到偶数,末位遇到奇数)将其二者交换,当首位指针>末位指针时,整个循环结束,即已经按奇数放左边、偶数放右边的规则将数组排列好。
#include <stdio.h>
char* reverse(char* str);
char* link(char* str1, char* str2);
void sort(int [], int);
#define N 10
int main()
{
//定义一个整形指针变量p,使它指向一个整形变量a,定义一个浮点型指针q,使它指向一个浮点型变量b,同时定义另外一个整形变量c并赋初值3;
int* p;
int a;
p = &a;
float* q;
float b;
q = &b;
int c = 3;
//使用指针变量,调用scanf函数分别输入a和b的值;通过指针间接访问并输出a,b的值;
printf("请输入a的值:");
scanf_s("%d", p);
printf("请输入b的值:");
scanf_s("%f", q);
printf("a的值为:%d", *p);
printf("\nb的值为:%f\n", *q);
//按十六进制方式输出p,q的值以及a,b的地址;
printf("p的值为:%p\n", p);
printf("q的值为:%p\n", q);
printf("a的地址为:%p\n", &a);
printf("b的地址为:%p\n", &b);
//将p指向c,通过p间接访问c的值并输出;输出p的值及c的地址
p = &c;
printf("c的值为:%d\n", *p);
printf("p的值为:%p\n", p);
printf("c的地址为:%p\n", &c);
getchar(); //清空缓冲区
//定义两个字符指针,通过gets()函数输入两个字符串;
char str1[100], str2[100];
printf("请输入字符串1:");
gets(str1);
printf("输入的字符串1为:%s\n", str1);
reverse(str1);
printf("字符串1逆置后为:%s\n", str1);
printf("请输入字符串2:");
gets(str2);
link(str1, str2);
printf("字符串1和字符串2连接后为:%s\n", str1);
int arr[N];
printf("请输入数组的元素:");
for (int i = 0; i < N; i++)
scanf_s("%d", &arr[i]);
sort(arr, N);
printf("排序后的数组为:");
for (int i = 0; i < N; i++)
printf("%d ", arr[i]);
return 0;
}
char* reverse(char* str)
{
char* p,* q, temp;
p = str;
q = str;
while (*p != '\0')
p++;
p--; //去掉最后一个"\0"
while (q < p) //交换
{
temp = *p;
*p = *q;
*q = temp;
q++;
p--;
}
return str;
}
char* link(char* str1, char* str2)
{
char* p = str1;
while (*p != '\0')
p++;
while (*str2 != '\0')
{
*p = *str2;
p++;
str2++;
}
*p = '\0';
return str1;
}
void sort(int arr[], int num)
{
int* p, * q, temp;
p = arr; //首位
q = arr + num - 1;//末位
while (p < q)
{
while (*p % 2 == 1) //为奇数
p++; //往下移一位
while (*q % 2 == 0)
q--;
if (q < p)
break;
temp = *p;
*p = *q;
*q = temp;
//再到下一位
p++;
q--;
}
1、指针基础及指针运算
(1)定义一个整形指针变量p,使它指向一个整形变量a,定义一个浮点型指针q,使它指向一个浮点型变量b,同时定义另外一个整形变量c并赋初值3;
(2)使用指针变量,调用scanf函数分别输入a和b的值;
(3)通过指针间接访问并输出a,b的值;
(4)按十六进制方式输出p,q的值以及a,b的地址;
(5)将p指向c,通过p间接访问c的值并输出;
(6)输出p的值及c的地址,并与上面的结果进行比较。
2、字符串的反转及字符串的连接
(1)定义两个字符指针,通过gets()函数输入两个字符串;
(2)定义一个函数char *reverse(char*str),通过指针将字符串反转;
(3)定义一个函数char *link(char *str1,char*str2),通过指针移动方式将两个字符串连接起来;
(4)从主函数中分别调用上述函数,输入字符串并打印输出结果。
3、数组元素的奇偶排列
(1)定义一个整形一维数组,任意输入N个数组元素,其中包含奇数和偶数;
(2)定义一个函数,实现将数组元素奇数在左,偶数在右的排列;
(3)在上述定义的函数中,不允许再增加新的数组;
(4)从主函数中分别调用上述函数,打印输出结果。
- 实验过程原始数据记录
截屏及解读
五、实验结果及分析
总结
能较为熟练地运用指针处理数据,这不仅节省了空间,省去多余的新变量,使操作更加简洁。