C语言 第七章 指针
例1.使用指针变量输出数据
1.两个*p含义不同,第一个是定义指针变量,第二个是表示所指变量的值。
2.&a表示a的地址。
3.定义指针变量时的数据类型是指指针变量指向的数据类型。
#include<stdio.h>
int main()
{
int a=2008;
int *p;
p=&a;
printf("%d\n",*p);
return 0;
}
使用指针变量:
1.初始化:int m; int *p=&m;
2.赋值:int m=12,*p,*q; p=&m; q=p;
3.输入数据:scanf("%d",p); == scanf("%d",&score);
4.输出:printf("%d\n",*p);
例2.指针变量应用实例
#include<stdio.h>
int main()
{
int a,b,*p,*p1,*p2;
printf("Input a,b");
scanf("%d,%d",&a,&b);
p1=&a;
p2=&b;
if(a<b)
{
p=p1;
p1=p2;
p2=p;
}
printf("%d,%d\n",*p1,*p2);
return 0;
}
指针与数组
指针与一维数组
对于长度是N的一维数组a,当使用指针p指向其首元素后,即可通过指针p访问数组的各个元素。
(a[0]用*p表示,a[1]用*(p+1)表示,a[i]用*(p+i)表示)
使指针变量p指向一维数组a:p=a; p=&a[0]
例3 用指针实现一维数组的输入输出。
程序一
#include<stdio.h>
#define N 10
int main()
{
int a[N];
int *p=a,i; //定义时初始化
for(i=0;i<N;i++)
scanf("%d",p+i);
for(i=0;i<N;i++)
printf("%d",*(p+i));
return 0;
}
程序二(与上个程序效果相同)
#include<stdio.h>
#define N 10
int main()
{
int a[N];
int *p=a,i;
for(i=0;i<N;i++)
scanf("%d",p++);
p=a; //复位
for(i=0;i<N;i++)
printf("%d",*p++);
return 0;
}
程序三
#include<stdio.h>
#define N 10
int main()
{
int a[N],*p;
for(p=a;p<(a+N);p++) //p的初始值指向a的首元素,之后每次后移一个位置
scanf("%d",p);
for(p=a;p<(a+N);p++)
printf("%d",*p);
return 0;
}
例4.用指针法访问数组,求得一维数组元素的最大值
#include<stdio.h>
#define N 10
int main()
{
int a[N],i,max,*p;
p=a;
for(i=0;i<N;i++)
scanf("%d",p+i);
max=*p; //用a[0]为max赋初值
for(i=1;i<N;i++)
if(max<*(p+i))
max=*(p+i);
printf("%d\n",max);
return 0;
}
指针与二维数组
设p是指针变量,若有p=a[0],对于a数组中的任何一元素a[i][j],指针一般形式:p+i*N+j (N等于列)
例5.用指针访问二维数组的方法,求二维数组元素的最大值。
#include<stdio.h>
int main()
{
int a[3][4]={{3,17,8,11},{66,7,8,19},{12,88,7,16}};
int *p,max;
for(p=a[0],max=*p;p<a[0]+12;p++)
if(*p>max)
max=*p;
printf("%d\n",max);
return 0;
}
指针与字符串
使字符型指针变量指向字符串的方法:
1.char *p="ajkjkdjj";
2.char name[20],*str;
gets(name);
str=name;
例6.从键盘输入一个字符串,统计其中的数字字符个数。
#include<stdio.h>
#define N 100
int main()
{
char str[N],*p;
int count;
gets(str);
p=str;
for(count=0;*p!='\0';p++)
if(*p>='0'&&*p<='9')
count++;
printf("%d\n",count);
return 0;
}
指针数组
数组元素为指针的数组,一般格式:数据类型 *数组名[数组长度]。指针数组的每个元素是指针变量,只能存储地址值。
例7.分行输出days数组指向的字符串
#include<stdio.h>
int main()
{
int i;
char *days[7]={"Sunday","Monday","Tuesday","Wednesday","Tursday","Friday","Saturday"};
for(i=0;i<7;i++)
puts(days[i]);
return 0;
}
指针作函数的参数
简单变量指针作函数参数
例8.输入两个整数,然后按照先大后小的顺序将其输出
#include<stdio.h>
int main()
{
void swap(int *,int *);
int x,y;
scanf("%d,%d",&x,&y);
if(x<y)
swap(&x,&y);
printf("%d,%d\n",x,y);
return 0;
}
void swap(int *p1,int *p2)
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
例9.用比较交换法,将一维数组的最大值移到数组的最末元素位置,交换过程用上述swap()函数实现。
#include<stdio.h>
int main()
{
void swap(int *,int *);
int i,a[10]={33,-12,97,3,7,18,9,51,10,9};
for(i=0;i<9;i++)
if(a[i]>a[i+1])
swap(&a[i],&a[i+1]);
for(i=0;i<10;i++)
printf("%5d",a[i]);
printf("\n");
return 0;
}
void swap(int *p1,int *p2)
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
指向数组的指针作函数的参数
例10.设计求一维数组元素最大值的函数pv_max(),并在主函数中调用它求数组元素的最大值。
#include<stdio.h>
#define N 10
int main()
{
int pv_max(int *,int);
int a[N],i;
for(i=0;i<N;i++)
scanf("%d",&a[i]);
printf("max=%d\n",pv_max(a,N));
return 0;
}
int pv_max(int *p,int n)
{
int i,max=*p;
for(i=1;i<n;i++)
if(max<*(p+i))
max=*(p+i);
return max;
}
字符串指针作函数参数
例11.从键盘输入一个字符串,统计其中的数字字符个数,统计数字字符串的过程用用户函数实现,要求字符串指针作函数参数。
#include<stdio.h>
#define N 100
int main(void)
{ char string[N];
int count_p(char *);
gets(string);
printf("Total: %d\n",count_p(string));
return 0;
}
int count_p(char *p)
{ int count;
for(count=0;*p!='\0';p++)
if(*p>='0'&&*p<='9') count++;
return count;
}
指针数组作函数的参数
指针数组的元素是指针变量,用指针数组能够实现一组字符串的处理。当用指针数组作函数参数时,就可设计通用的多字符串操作函数。
例13 编写能对多个字符串排序的函数,并调用该函数将一组字符串按字典顺序排序。
#include<stdio.h>
#include<string.h>
int main()
{
void string_sort(char *[],int);
void string_out(char *[],int);
char *days[7]={"Sunday","Monday","Tuesday", "Wednesday", "Thursday", "Friday","Saturday"};
string_sort(days,7);
string_out(days,7);
return 0;
}
void string_out(char * string [],int n)
{ int i;
for(i=0;i<n;i++)
printf("%s ", string [i]);
}
void string_sort(char *string[],int n)
{
char *temp;
int i,j;
for(i=1;i<n;i++)
{for(j=0;j<n-i;j++)
if(strcmp(string [j], string [j+1])>0)
{temp= string [j];
string [j]= string [j+1];
string [j+1]=temp;
}
}
}
指针函数
函数返回值是指针类型的函数称为指针函数
例14 编写能够查找长度最大的字符串的函数,并调用该函数求一组字符串中的最长字符串。
#include<stdio.h>
#include<string.h>
int main()
{ char *max_len(char *[],int);
char *p_string[4]={"Sydney2000","Beijing2008","Athens1996","Korea1992"};
puts(max_len(p_string,4));
return 0;
}
char *max_len(char *string[],int n)
{ int i,posion,max_l;
posion=0;
max_l=strlen(string[0]);
for(i=1;i<n;i++)
if(strlen(string[i])>max_l)
{ max_l=strlen(string[i]); posion=i; }
return(string[posion]);
}