指针操作二维数组和函数

二维数组:

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值