《C语言程序设计》指针模块学习指导
第六部分:指针模块学习指导
知识点
概论
一、什么是指针
二、常见指针变量的定义
实验案例
(参考书籍:安徽工程大学C语言程序设计配套实验教材)
实验名称 指针的定义及使用Ⅰ
1.
(1)① a或a[0] ②j==k ③a[j][k]=1 ④a[j][k]=0
(2) ① &a ② &b
2.
(1) 程序功能:使用指针变量求解2个整数的升序输出
(2) 程序结果:26
(3)编程并上机调试运行(用指针编写程序并上机验证)
3.
(1) 用变量的指针作函数调用的实参,降序输出3个整数。
void exchange(int *pointer1, int *pointer2)
{ int temp;
temp=*pointer1, *pointer1=*pointer2, *pointer2=temp;
}
/*主函数main()*/
void main()
{ int num1,num2,num3;
/*从键盘上输入3个整数*/
printf("Input the first number: "); scanf("%d", &num1);
printf("Input the second number: "); scanf("%d", &num2);
printf("Input the third number: "); scanf("%d", &num3);
printf("num1=%d, num2=%d, num3=%d\n", num1, num2, num3);
/*输出3个变量的初值*/
/*排序*/
if( num1 < num2 ) /*num1<num2*/
exchange( &num1, &num2 ); /*指针作实参调用函数exchange(),互换num1和num2的值*/
if( num1 < num3 ) exchange( &num1, &num3 );
if( num2 < num3 ) exchange( &num2, &num3 );
/*输出排序结果*/
printf("排序结果: %d, %d, %d\n",num1,num2,num3);
}
(2)将数组a中的n个整数按相反顺序存放。
void inv(int *x,int n) /*形参x为指针变量*/
{
int *p,temp,*i,*j,m=(n-1)/2;
i=x;j=x+n-1;p=x+m;
for(;i<=p;i++,j--)
{ temp=*i;*i=*j;*j=temp;}
return;
}
void main()
{ int i,a[10]={3,7,9,11,0,6,7,5,4,2};
printf("The original array:\n");
for(i=0;i<10;i++)
printf("%d,",a[i]);
printf("\n");
inv(a,10);
printf("The array has benn inverted:\n");
for(i=0;i<10;i++)
printf("%d,",a[i]);
printf("\n");
}
(3)从 7 个数中找出其中最大值和最小值(用指针实现)
int max , min ;
void max_min_value (int array[ ] , int n )
{
int *p , *array_end ;
array_end = array + n ;
max = min = *array ;
for ( p=array+1; p<array_end ; p + + )
if (*p>max ) max = *p ;
else if( *p < min ) min = *p ;
}
void main( )
{
int i, number[7] ;
printf ( “ enter 7 data \n ”) ;
for( i=0; i<7; i++ )
scanf ( “ %d ”, &number[i] ) ;
max_min_value( number, 7 ) ;
printf ( “ \n max = %d , min = %d \n ”, max , min ) ;
}
4.
编写函数实现在字符数组w中插入字符x。函数原型是:void fun(char *w,char *x,int *n);。说明:
(1)假设w数组中的数已按由小到大顺序存放;
(2)n指向存储单元中数组元素的个数;
(3)插入后数组中的数仍有序。
void fun (char *w,char x,int *n)
{ int i,p;
p=0;
w[*n]=x;
while (x>w[p]) p++ ;
for(i=*n;i>p;i--)
w[i]= *(w+i-1);
w[p]=x;
++ *n;
}
实验名称 指针的定义及使用Ⅱ
1. 运行结果为:book
① 处填 * ②处填ps+10 ③处填ps
2. 程序功能:在输入的字符串中查找有无‘k’字符。
3.编程并上机调试运行
(1) 输入5个国名并按字母顺序排列后输出
void main()
{
void sort(char *name[],int n);
void print(char *name[],int n);
static char *name[]={ "CHINA","AMERICA","AUSTRALIA",
"FRANCE","GERMANY"};
int n=5;
sort(name,n);
print(name,n);
}
void sort(char *name[],int n)
{
char *pt;
int i,j,k;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(strcmp(name[k],name[j])>0) k=j;
if(k!=i)
{
pt=name[i];
name[i]=name[k];
name[k]=pt;
}
}
}
void print(char *name[],int n)
{
int i;
for (i=0;i<n;i++) printf("%s\n",name[i]);
}
(2)编写函数实现求某字符串的长度,运行时输入字符串。
int len(char* str)
{
int i=0;
while(*str++)
i++;
return i;
}
void main()
{
char s[80];int num;
gets(s);
num=len(s);
printf(“%d”,num);
}
(3)用函数调用方式,实现字符串的复制。
void string_copy(char *str_from, char *str_to)
{ int i=0;
for(; (*(str_to+i)=*(str_from+i))!='\0'; i++) ; /*循环体为空语句*/
}
void main()
{ static char array_str1[20]="I am a teacher.” ;
char array_str2[20];
string_copy(array_str1, array_str2);/*数组名作实参*/
printf("array_str2=%s\n", array_str2);
}
/*string_copy()函数:复制一个字符串*/
/*形参:字符指针str_from接收源串,字符指针 str_to存储目标串 */
(4) 编写函数将字符串s中的子字符串s1全部替换为子字符串s2.用指针、函数实现。
void replace(char *s, char *s1, char *s2)
{
int len1 = strlen(s), len2=strlen(s1), len3 = strlen(s2);
char buf[MAXLENGTH];
int i, j, k, l;
for(i=0, k=0;i<len1-len2+1)
{
for(j=0;j<len2;j++)
{
if(*(s+i+j) != *(s1+j)) break;
}
if(j == len2)
{
l = 0;
while(l<len3) *(buf+k++) = *(s2+l++);
i += len2;
continue;
}
else
{
*(buf+k++) = *(s+i++);
}
}
while(i<len1) *(buf+k++) = *(s+i++);
*(buf+k) = '\0';
strcpy(s, buf);
}
void main()
{
char str[MAXLENGTH] = {NULL};
char str1[MAXLENGTH] = {NULL};
char str2[MAXLENGTH] = {NULL};
printf("请输入字符串s: \n");
gets(str);
fflush(stdin);
printf("请输入字符串s1: \n");
gets(str1);
fflush(stdin);
printf("请输入字符串s2: \n");
gets(str2);
replace(str, str1, str2);
printf("替换后的字符串: %s\n", str);
return 0;
}
(5)将输入的字符串逆序输出。
#include<stdio.h>
#include<string.h>
int fun (char *);
int main()
{
char a[256];
printf("请输入字符串:\n");
gets(a);
fun(a);
printf("逆序转换后的字符串是:\n");
puts(a);
}
int fun(char *s)
{
int n,i;char c;
n=strlen(s);
printf("%d",n);
for(i=0;i<=(n/2-1);i++)
{
c=*(s+i);*(s+i)=*(s+n-1-i);*(s+n-1-i)=c;
}
return 0;
}
(6)将一个指针所指向字符串中的大写字母复制到另一个指针所指向的字符数组中。
void fun(char *strA, char *strB);
void main(void)
{
char strA[N];
char strB[N];
printf("请输入字符串:\n");
gets(strA);
fun(strA, strB);
printf("复制后的字符串:\n");
puts(strB);
}
void fun(char *strA, char *strB)
{
int i;
int k = 0;
for (i=0;strA[i] != '\0';i++)
{
if ((strA[i] >= 'A') && (strA[i] <= 'Z'))
{
strB[k++] = strA[i];
}
}
strB[k] = '\0';
}
往期推荐
文字 | 李杨
编辑 | 杨涛
校审 | 潘颢