二维数组:
1.C语言中并不存在,真正的二维数组。
2.二维数组本质 是一维数组的一维数组
3.二维数组也符合数组的特点:连续性,有序性,单一性
注意: :
二维数组的操作:从二维数组的本质进行的
二维数组的本质:一维数组的 一维数组
(直接的访问操作也是一维一维的展开)
指针操作二维数组
二维数组:int a[2][3]; //本质上为 int [3] a[2],即一个int[3] 类型的一维数组
根据数组类型用指针指向该二维数组,则指针基类型为int [3],但因为C语言中不支持int [3] * 的形式,故正确的写法为 int (*p)[3],此时指针变量p指向二维数组a 。
*p <=> a[0] // 相当于是内部这个一维数组的数组名
(*p)[0] <=> *((*p)+0)*(*p+0) <=> **p
*(*(p+1)+1) <=> a[1][1]
*(*(p+i)+j) <=> a[i][j]
用指针指向二维数组,找到数组中能被3整除的数:
#include<stdio.h>
void div3Num(int (*a)[3],int row)
{
int i = 0;
int j = 0;
for(i = 0;i < row;++i)
{
for(j = 0;j < 3;++j)
{
if(*(*(a+i)+j)%3 == 0)
{
printf("%d\n",*(*(a+i)+j));
}
}
}
}
int main(void)
{
int a[3][3]={1,2,3,4,5,6,7,8,9};
int row = sizeof(a)/sizeof(a[0]);
div3Num(a,row);
return 0;
}
指针操作二维字符型数组
如何定义指向二维字符型数组的指针?(指针指向形式与二维整型数组相同)
char s[ ][10] = {"aaa","bbb","ccc"}; //char[10] s[ ],可看作是一维数组的一维数组
char (*p)[10] = s; //指针变量 p 指向二维字符型数组s,*p <=>s[ ]
存放字符串的形式:
① char s[ ][10] = {"aaa","bbb","ccc"}; //二维数组存放多个字符串
② char *pstr[ ] = {"aaa","bbb","ccc"}; //数组中存放的是字符串的地址(地址存放着数据的数组)
---------------------------------
char **p = pstr; // p二级指针 *(*(p+i)+j) --- p[i][j]
用指针的形式对字符串进行排序:
#include<stdio.h>
#include<string.h>
void selectSort(char **p,int len)
{
int i = 0;
int j = 0;
for(i = 0;i < len-1;++i)
{
for(j = i+1;j < len;++j)
{
if(strcmp(*(p+i),*(p+j)) > 0)
{
char *t = *(p+i);
*(p+i) = *(p+j);
*(p+j) = t;
}
}
}
}
void printStr(char **p)
{
int i = 0;
for(i = 0;i < 3;++i)
{
printf("%s\n",*(p+i));
}
}
int main(void)
{
char *p[] = {"hello","world","china"};
selectSort(p,3);
printStr(p);
return 0;
}
我们常使用的main函数形式为 int main (void),完整的形式使用也是使用了指针数组存放命令行参数,如下:
//argc --- 命令行参数的个数
// argv --- 存放命令行参数的字符串的指针数组
#include<stdio.h> int main(int argc, const char *argv[]) { printf("argc = %d\n",argc); int i = 0; for(i = 0;i < argc;++i) { printf("argv[%d] = %s\n",i,argv[i]); } return 0; }
运行过程和结果:
指针 + 函数
通过指针方式来调用函数
函数名 --- 代表函数的入口地址
--- 函数类型:int (int ,int) ,返回值为int型,带有两个int型的形参变量
函数指针:int (*p)(int,int)
说明:
1、可以定义一个函数类型的指针变量 -- 来保存函数的地址入口
2、有了这个函数指针变量 -- 通过指针变量进行函数调用
回调函数 --- 通过函数指针调用函数就是回调
利用回调函数实现" + " 、" - "、" * "、" / " :
#include<stdio.h>
int func1(int a,int b)
{
return a+b;
}
int func2(int a,int b)
{
return a-b;
}
int func3(int a,int b)
{
return a*b;
}
int func4(int a,int b)
{
return a/b;
}
void processDate(int a,int b,int (*pfunc)(int,int))
{
printf("%d\n",pfunc(a,b));
}
int main(void)
{
int a,b;
printf("Input two num:");
scanf("%d %d",&a,&b);
processDate(a,b,func1);
return 0;
}