指针入门

理解指针作为函数的参数

先从交换两个数说起:
(一)所有功能在主函数中实现:

#include<stdio.h>
int main()
{
 int x,y,t;   
 printf("请输入x和y:"); 
 scanf("%d %d",&x,&y);
    t=x,x=y,y=t;
 printf("x=%d,y=%d\n",x,y);
}

(二)把两个变量值交换的功能用一个函数实现,要用指针作函数参数。

#include<stdio.h>
// 交换两个地址中的值的函数
void fun(int *m,int *n)  

       int t;
       t=*m;*m=*n;*n=t;
}
int main()
{
       int x,y,t;
       printf("x,y=");
       scanf("%d,%d",&x,&y);
       fun(&x,&y);             // 调用时传送地址
       printf("x=%d,y=%d\n",x,y);
}


一维数组的指针

通过输入输出若干整数来理解:

(一)通过指针变量的移动实现数组元素的处理。
【指针移动法】

#include<stdio.h>
int main()
{
 int a[10],i,*p;          // 定义指向一维数组的指针变量p
 p=a;                  // 指针变量p获取一维数组a的首地址
 printf("请输入10个整数:");
 for(i=0;i<=9;i++)
  scanf("%d",p++);   // 通过指针变量p表示每个元素的地址
 p=a;
 for(i=0;i<=9;i++)
  printf("%5d",*p++);  // 通过指针变量p输出每个元素的值
}

【指针不动法:指针+下标】

#include<stdio.h>
int main({

       int a[10],i,*p;               // 定义指向一维数组的指针变量p
       p=a;                      // 指针变量p获取一维数组a的首地址
       printf("请输入10个整数:");
       for(i=0;i<=9;i++)
              scanf("%d",p+i);        // 通过指针变量p表示每个元素的地址
       for(i=0;i<=9;i++)
              printf("%5d",*(p+i));     // 通过指针变量p输出每个元素的值
}

(二)通过指向字符串的指针变量实现字符串的处理。
用指向字符串的指针变量实现多个字符串的输入输出:
这里用的是指针不动法:

#include<stdio.h>
main()
{
 char a[5][20],(*p)[20];     // 定义指向多个字符串的指针变量p
 int i;
 p=a;                    // 指针变量p指向二维字符数组a
 printf("请输入5个字符串\n");
 for(i=0;i<=4;i++)
 {
  printf("请输入第 %d 个字符串: ",i+1);
  scanf("%s",p+i);     // 通过指针变量p接收字符串
 }
 printf("您输入的 5 个字符串是:\n");
 for(i=0;i<=4;i++)
  printf("%s\n",p+i);  // 通过指针变量p输出字符串
}

接下来是指针移动法:

#include<stdio.h>
main()
{
 char a[5][20],(*p)[20];     // 定义指向多个字符串的指针变量p
 int i;
 p=a;                    // 指针变量p指向二维字符数组a
 printf("请输入5个字符串\n");
 for(i=0;i<=4;i++)
 {
  printf("请输入第 %d 个字符串: ",i+1);
  scanf("%s",p++);     // 通过指针变量p接收字符串
 }
 p=a;
 printf("您输入的 5 个字符串是:\n");
 for(i=0;i<=4;i++)
  printf("%s\n",p++);  // 通过指针变量p输出字符串
}

二维数组的指针

二维数组:定义一个3行3列的二维数组,通过指向二维数组的指针实现对数组元素的输入和输出。

用指向二维数组的指针处理:

#include<stdio.h>
main()
{
       int a[3][3],i,j;
       int (*p)[3];                 // 定义指向二维数组的指针变量p
       p=a;                      // 指针变量p获取二维数组的首地址
       printf("请输入3行3列数据:\n");
       for(i=0;i<=2;i++)
              for(j=0;j<=2;j++)
                     scanf("%d",*(p+i)+j);
 // 通过指针变量p接收数组元素的值
       printf("你输入的3行3列数据是:\n");
       for(i=0;i<=2;i++)
       {
              for(j=0;j<=2;j++)
                     printf("%4d",*(*(p+i)+j));  // 通过指针变量p打印数组元素
              printf("\n");
       }
}


把二维数组当一维数组来处理,实现对数组元素的输入和输出:

【方法】指针不动法

#include<stdio.h>

int main({
       int a[3][3],i,j;
       int *p;                  // 定义指针变量p
       p=&a[0][0];             // 指针变量p获取二维数组的首地址
       printf("请输入3行3列数据:\n");
       for(i=0;i<=8;i++)
              scanf("%d",p+i);      // 通过指针变量p接收数组元素的值
       printf("你输入的3行3列数据是:\n");
       for(i=0;i<=8;i++)
       {
              printf("%4d",*(p+i));
   // 通过指针变量p打印数组元素
              if((i+1)%3==0)         // 控制换行
                     printf("\n");     
       }
}


函数指针的应用

下面看一道例题:定义一个函数max_min,求数组a的最大值和最小值,将最大值和最小值分别存入形参指针pmax和pmin所指存储单元,函数原型如下:

void max_min(int a[],int n, int *pmax ,int *pmin)

在主函数中读入n和n个整数,调用上述函数,输出最大值和最小值。

我这里用C++的格式来实现:

#include<iostream>
using namespace std;
void max_min(int a[], int n, int *pmax, int *pmin)//指针函数:返回最大值和最小值的地址
{
	*pmax=*pmin=a[0];
	for(int i=1;i<n;i++)	
	{
		if(*pmax<a[i])
		*pmax=a[i];	//把a[i]赋值给最大值; 
		else if(*pmin>a[i])
		*pmin=a[i];//把a[i]赋值给最小值; 
}

}
int main() 
{
	int n;
	int max,min;
	int b[n];
	cout<<"请输入整数的个数:"; 
	cin>>n;
	cout<<"请输入n个整数:" ; 
	for(int i=0;i<n;i++)
	{
		cin>>b[i];		//输入n个整数 
	}
	max_min(b,n,&max,&min);//调用指针函数
	cout<<"最大值、最小值为:" ; 
	cout<<max<<" "<<min<<endl;//最后输出的是
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值