嵌入式学习第十五天--二维字符型数组,指针函数,回调函数

对于昨天的疑问补充

p+1与*(p+1)的区别

从结果来说,它们指向的地址是相同的,但是它们的基类型不同

p+1

当 p 是一个指向二维数组的指针时,p+1 表示移动到下一行的首元素。由于 p 是一个指针到一个包

含 N 个 int 的数组,p+1 将跳过 N 个 int 的大小,从而指向下一行的开始。

*(p+1)

这个表达式首先执行 p+1,然后对结果进行解引用(即访问它指向的数组)。由于 p+1 已经指向了

下一行的首元素,*(p+1) 就是访问这个元素,也就是第二行的第一个元素。

指针操作二维字符型数组 

之前学到二维字符型数组的本质是存放多个字符串的一维数组

既然二维数组的本质是一维数组,那是不是也可以用*p来操作访问到每一个元素

char s[3][3];
char *p = s[0][0];    //定位s[0][0]的地址,之后的p+1将会移到下一个元素而不是下一行
int i;
for(i = 0;i < 9;i++)
{
    printf("%d ",*(p+i));
} 

思考后得出, 以上方法可遍历二维数组

在学习二维数组的过程中,了解到了mian函数也是有形参的,形式为

int main(int argc,const char * argv[])
argc为传参的个数,argv[]是用来存储传的参数

 在linux的命令行中进行传参

eg:        ./a.out 2 2024

会传./a.out 2 2024三个参数,argc=3

二维字符型数组练习

找出字符串中最大值

char *strMax(char **p,int len)
{
	int i;
	char *max=*p;    //定位首地址
	for(i = 1;i < len;i++)
	{
		if(strcmp(*(p+i),max)>0)
		{
			max=*(p+i);    //传较大值的地址
		}
	}
	return max;    //返回值为地址,而不是字符串
}

实现字符串的逆序

void reverse(char **begin,char **end)
{
	char *t=NULL;
	while(begin<end)
	{
		t = *begin;
		*begin = *end;
		*end = t;
		begin++;
		end--;
	}
}

 指针 + 函数: 

通过指针的方式来调用函数 
函数名 --- 代表函数的入口地址 
int add(int a,int b)——该函数的数据类型为 int (int , int)

而指针的形式为 基类型 * 变量名

所以用指针指向函数可写为 Int (*p) (int ,int),其主要应用为回调函数

说明

1.可以定义一个函数类型的指针变量,来保存函数的入口地址

2.有了这个指针变量,通过指针变量,来进行函数调用

回调函数

回调函数是通过函数指针调用函数

练习:通过回调函数实现对数据的平方立方等不同情况的排序 

int func1(int n)
{
	return n;
}

int func2(int n)
{
	return n*n;
}

int func3(int n)
{
	return n*n*n;
}

void choiceSort(int *a,int len,int (*p) (int))    //int (*p) (int)该函数指针的形参只有一个                
                                                    int型的数,传参时,实参函数的形参类型和        
                                                    数目应与其相同
{
	int i,j;
	for(i = 0;i < len-1;i++)
	{
		for(j = i+1;j<len;j++)
		{
			if(p(a[i])>p(a[j]))
			{
				int t=a[i];
				a[i] = a[j];
				a[j] = t;
			}
		}
	}
}
nt main(int argc, const char *argv[])
{
	int a[10]={6,5,-9,4,1,-2,7,-3,8,10};
	int len = sizeof(a)/sizeof(a[0]);

    choiceSort(a,len,func3);
}

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值