指针操作二维数组,指针数组,指针函数(15)

一、指针 操作 二维数组 

关于二维数组

1.c语言中并不存在,真正的二维数组。
2.二维数组本质 是一维数组的一维数组 
3.二维数组 也 符合数组的特点 //连续性,有序性,单一性

问题:
1.确定需要定义什么类型的指针?
 //从二维数组的本质出发 
int[3] a[2]; 

 &a[0]
    //a[0]  --- int[3]
    //&a[0] --- int[3] * 
    //c语言中 不支持 int[3] *  
    //正确写法 int(*)[3]

int(*p)[3] = a; //p指向二维数组 a 
                //p的基类型 int[3]

*p <=> a[0] // 相当于是内部这个一维数组的数组名 
       (*p)[0] 
       *(*p+0) //**p

*(*(p+1)+1) <=> a[1][1]
*(*(p+i)+j) <=> a[i][j]       
   

注意:  
   二维数组的操作
   从二维数组的本质 进行的 
   二维数组的本质 一维数组的 一维数组
   直接的访问操作 也是 一维一维的展开

#include<stdio.h>

void zhenchu(const int (*p)[4],int len)
{
	int i = 0;
	int j = 0;

	for(i = 0;i<len;++i)
	{
		for(j = 0;j<4;++j)
		{
			if(*(*(p+i)+j)%3==0)
				printf("%d \n",*(*(p+i)+j));
		}
	}
}

int main(void)
{
	int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
	int len = sizeof(a)/sizeof(a[0]);

	zhenchu(a,len);

	return 0;
}

二、指针操作二维字符型数组

char s[][10] = {"hello","world","china"};

char (*p)[10] = s; //p指向二维数组s 

char[10] s1[3]; //二维数组 //此时的二维数组的元素 是一个一维字符型数组 
                //定义一个存放 字符串 的一维数组

练习,输入三个字符串排序输出

#include<stdio.h>
#include<string.h>

void choice(char (*p)[100],int len)
{
	int i,j;
	for(i = 0;i < len-1;++i)
	{
		for(j = i+1;j < len;++j)
		{
			if(strcmp(*(p+i),*(p+j)) > 0)
			{
				char c[100];
				strcpy(c,*(p+i));
				strcpy(*(p+i),*(p+j));
				strcpy(*(p+j),c);
			}
		}
	}
}

void Gets(char (*p)[100],int len)
{
	int i;
	for(i = 0;i < len;++i)
	{
		gets(*(p+i));
	}
}

int main(void)
{
	char s[3][100];
	int len = sizeof(s)/sizeof(s[0]);
	char (*p)[100] = s;

	Gets(s,len);
	
	choice(s,len);

	int i;
	for(i = 0;i < len;++i)
	{
		puts(*(p+i));
	}

	return 0;
}

三、指针数组

char *p = "hello"; //p的类型 char *  
                   //char *的指针变量p 相当于代表一个字符串 

char *p1 = "hello";
char *p2 = "world";
char *p3 = "china";

char* pstr[3]= {"hello","world","china"}; //数组 --- 数组中存放是 各个字符串的地址
      //地址 ---存放这地址数据的数组 --- 指针的数组 ---指针数组 

char **q = pstr; //q 二级指针 

练习:找出字符串最大值,实现排序,逆序

char *max(char **p,int len)
{
	char *q = *p;

	int i;
	for(i = 1;i<len;++i)
	{
		if(strcmp(q,*(p+i))<0)
		{
			q = *(p+i);
		}
	}
	return q;
}
void bubble(char **p,int len)
{
	int i,j;
	for(i = 1;i<len;++i)
	{
		for(j = 0;j<len-1;++j)
		{
			if(strcmp(*(p+j),*(p+j+1))>0)
			{
				char *m = *(p+j);
				*(p+j) = *(p+j+1);
				*(p+j+1) = m;
			}

		}
	}
}
void nixu(char **begin,char **end)
{
	while(begin < end)
	{
		char *m = *begin;
		*begin = *end;
		*end = m;
		begin++;
		end--;
	}
}

注:要改变指针数组中的地址,字符串常量区的字符串不能改

四、main函数的参数

五、指针 + 函数:

通过指针 的方式 来调用函数

函数名 --- 代表函数的入口地址 

int add(int a,int b) // 函数  
  // 函数名 - 代表函数的入口地址 
  // 函数名对应的数据类型 
  // int (int a,int b) //函数类型 
  // 代表一类函数
  // 返回值为int型
  // 带有两个int型的形参变量 

说明:
 1.可以定义一个函数类型的指针变量 
   来保存函数的入口地址 
 2.有了这个指针变量 
   通过指针变量 进行函数调用 

//回调函数 --- 通过函数指针调用函数 就是回调 
//c语言中,使用了 函数指针 实现回调 

练习:
    写一个程序 实现加,减,乘,除
    以回调函数的形式,打印对应的结果 
    void processData(int a,int b, int (*pfunc)(int,int))
    {
        printf();
    }

#include<stdio.h>

int add(int a,int b)
{
	return a + b;
}

int jian(int a,int b)
{
	return a - b;
}

int chen(int a,int b)
{
	return a * b;
}

int chu(int a,int b)
{
	return a / b;
}

void processData(int a,int b,int (*pfunc)(int,int))
{
	printf("%d\n",pfunc(a,b));

}

int main(void)
{
	int a,b;
	scanf("%d%d",&a,&b);
	processData(a,b,add);

	return 0;
}

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值