对于昨天的疑问补充
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);
}