一、指针 操作 二维数组
关于二维数组
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;
}