C语⾔开放实验(指针)
C语⾔开放实验
指针
实验⼀指向变量的指针变量编程
⼀.实验⽬的与要求
1. 理解指针的概念。
2. 掌握指针变量的定义与使⽤。
3. 掌握指针变量作为函数参数的使⽤⽅法。
⼆.实验题⽬
1. 阅读以下程序,设输⼊是1 3 5↙,写出程序的运⾏结果,再上机验证。
#include
int fun(int *p)
{
int s=10;
s=s+*p;
return(s);
}
int main( )
{
int i, a, b, *p;
for(i=0; i<3; i++)
{
p=&a
scanf("%d", p);
b=fun(p);
printf("b=%d\n", b);
}
return 0;
}
2. ⽤指针变量编程,求数组中的最⼤元素和最⼩元素。
3. 编写函数实现两个数的交换(⽤指针变量作函数参数),利⽤该函数交换数组a和b 中对应元素的值。(注意:调⽤函数时实参应为什么值)
例如:已知数组a[5]={1, 2, 3, 4, 5}; b[5]={6, 7, 8, 9, 10};
a和b中对应元素交换后:a[5]={6, 7, 8, 9, 10}; b[5]={1, 2, 3, 4, 5};
实验⼆字符指针编程
⼀.实验⽬的与要求
1. 理解字符指针的概念。
2. 掌握字符指针的定义与使⽤。
⼆.实验题⽬
1. 阅读以下程序,先写出程序的运⾏结果,再上机验证。
#include
#include
int main( )
{
char *p1, *p2, a[20]="language", b[20]="programme";
int k, len;
p1=a;c语言指针实验总结
p2=b;
len=strlen(b);
for(k=0; k
{
if(*p1= =*p2) putchar(*p1);
p1++;
p2++;
}
return 0;
}
2. 请改正程序中的错误,使程序能得出正确的结果。下列给定程序中,函数fun的功能是:分别统计字符串中⼤写字母和⼩写字母的个数。
例如:字符串为“ABcdBC#2cdEFghab”,则应输出:upper=6,lower=8
#include
void fun (char *s, int a, int b)
{
while(*s)
{
if (*s>='A' && *s<='Z') a++;
if (*s>='a' && *s<='z') b++;
s++;
}
}
int main( )
int upper=0, lower=0;
char s[80];
gets(s);
fun(s, &upper, &lower);
printf("\n upper=%d, lower=%d\n", upper, lower);
return 0;
}
3. ⽤字符指针编程求出字符串中指定字符的个数。
例如:假设字符串为:“abcdaghckpamn”,指定字符为…a?,则结果为3。要求:从main函数输⼊字符串和指定字符,输出结果。
实验三指向⼀维数组的指针变量编程⼀.实验⽬的与要求
1. 理解指针与数组之间的关系。
2. 掌握⽤指针变量引⽤数组元素的⽅法。
3. 掌握⽤指向⼀维数组的指针变量编程。
⼆.实验题⽬
1. 阅读以下程序,先写出程序的运⾏结果,再上机验证。
#include
int main( )
{
int a[10]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int i, n, temp, *p;
printf("输⼊n(n<10):");
scanf("%d", &n);
for(i=1; i<=n; i++)
{
temp=*(a+9);
for(p=a+9; p>a; p--)
*p=*(p-1);
*a=temp;
}
for(i=0;i<10;i++)
printf("%3d", *(a+i));
printf("\n");
return 0;
2. 已知⼀个整型数组,编程将其数组元素的值改为当前元素与相邻的下⼀个元素的乘积,数组的最后⼀个元素改为它与第0个元素的乘积,要求⽤指针变量实现。
例如:已知a[5]={1, 2, 3, 4, 5}; 计算后a[5]={2, 6, 12, 20, 10}。实验四指向⼆维数组的指针变量编程
⼀.实验⽬的与要求
1. 理解⼆维数组的地址表⽰⽅法。
2. 掌握⽤指针变量表⽰⼆维数组的元素和元素的地址。
3. 掌握⽤指向⼆维数组的指针变量的使⽤。
⼆.实验题⽬
1. 阅读以下程序,先写出程序的运⾏结果,再上机验证。
#include
#define N 3
#define M 4
void input(int a[N][M]);
void output(int (*p)[M]);
int main( )
{
int num[N][M], i, j, flag;
printf("输⼊⼆维数组num[%d][%d]的数据:\n", N, M);
input(num);
printf("⼆维数组的数据如下:\n");
output(num);
flag=0;
for(i=0; i
for(j=0; j
flag=*(num[i]+j)<0;
if(flag)
printf("num[%d][%d]=%d\n",i-1,j-1,num[i-1][j-1]);
假设输⼊数据如下: 2 5 7 0↙ 1 -4 3 8↙ 9 6 -2 5↙
else printf("查失败!\n");
return 0;
}
void input(int a[N][M])
{
int i, j;
for(i=0; i
for(j=0; j
scanf("%d", a[i]+j );
}
void output(int (*p)[M])
{
int i, j;
printf("\n");
for(i=0; i
{
for(j=0; j
printf("%3d", *(*(p+i)+j) );
printf("\n");
}
}
2. ⽤⼀个⼆维数组score[4][3]来存放4个学⽣3门课的成绩,编程实现:
(1) 输⼊学⽣成绩;
(2) 求出每个学⽣的平均分,将其保存在数组a[4]中;
(3) 求出每门课程的平均成绩,将其保存在数组b[3]中;
(4) 输出数组a、b中成绩。
要求:⽤指向⼆维数组元素的指针变量实现。
常见错误及解决⽅法
1. 混淆变量声明中的'*'号和使⽤指针变量时的'*'号。
例如:int *p, x=10;
*p=&x //赋值语句错误
解决⽅法:变量声明中的'*'号是表⽰该变量是指针类型的变量,⽽在指针变量时的'*'号是“指针运算符”,它的作⽤是取指针变量所指向的存储单元的内容(即取指针变量所指向的变量)。上例正确写法是:
p=&x //令指针变量p指向变量x
*p=20; //令p指向的存储单元赋值为20,等价于x=20;
2. 在指针变量进⾏指针运算之前没有给它赋值。
例如:int *p;
*p=10; //赋值错误
指针变量p指向的是⼀个随机的内存地址,执⾏*p=10;时,程序则会在p所指向的随机位置处写⼊⼀个10,这时程序有可能⽴即崩溃,也可能等上半⼩时然后崩溃,或者破坏程序另⼀部分的数据。编译时会出现以下警告信息:
warning C4700: local variable 'p' used without having been initialized
警告C4700:局部变量'p'在使⽤前未初始化
解决⽅法:必须先对指针变量进⾏赋值,令指针变量指向⼀个明确的存储空间,再对指针变量进⾏指针运算。上例正确写法是:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。