1 用函数指针变量调用函数
在 C 语言中,可以定义一个指针变量来指向函数。通过这种方式,可以使用函数指针变量来调用函数,实现动态地选择要执行的函数。
函数指针变量的定义形式为:数据类型(*指针变量名)(函数参数表列)
函数的调用可以通过函数名调用,也可以通过函数指针调用
int(*p)(int,int):表示定义一个指向函数的指针变量p,而不是固定的指向哪一个函数,而只是定义了这样一个类型的变量
int doublecmp(const void *p1,const void *p2)
{
double *q1 = (double *)p1;
double *q2 = (double *)p2;
if(*q1 > *q2)
{
return 1;
}
else if(*q1 < *q2)
{
return -1;
}
else
{
return 0;
}
}
int main()
{
double a[] = {1,-2,3,-4,5,-6,7,-8,9,0};
int len = sizeof(a) / sizeof(a[0]);
qsort(a,len,sizeof(a[0]),doublecmp);
int i;
for(i = 0;i < len;++i)
{
printf("%f\n",a[i]);
}
return 0;
}
2 用指向函数的指针作函数参数
把指针作为参数传到其他函数
指针数组和指向指针的指针
1 指针数组的概念
指针数组是一个数组,其元素都是指针类型。指针数组的每个元素都可以指向不同的内存地址或数据。
定义指针数组的形式为:类型名 *数组名[数组长度];
2 指向指针的指针
指向指针的指针是一种多级指针,它指向的是另一个指针变量的地址。
定义指向指针的指针的形式为:类型名 **指针变量名;
通过指向指针的指针,可以间接访问其所指向的指针所指向的数据:
void printString(char **s,int len)
{
int i;
for(i = 0;i < len;++i)
{
puts(s[i]);
}
}
void swap(char **s1,char **s2)
{
char *t;
t = *s1;
*s1 = *s2;
*s2 = t;
}
void reverse(char **s,int len)
{
int i;
for(i = 0;i < len / 2;++i)
{
swap(&s[i],&s[len - i -1]);
}
}
void sortString(char **s,int len)
{
int i,j;
for(i = 0;i < len - 1;++i)
{
for(j = i + 1;j < len;++j)
{
if(strcmp(*(s + i),*(s + j)) > 0)
{
swap(s + i,s + j);
}
}
}
}
3 指针数组作 main 函数的形参
在 C 语言中,main
函数可以接受两个参数,其中第二个参数是一个指向指针的指针,通常用于处理命令行参数。
在运行程序时,可以在命令行中输入多个参数,这些参数将被存储在 argv
指针数组中,argc
表示参数的个数。在 main
函数中,可以通过遍历 argv
数组来获取和处理命令行参数。
4、排序
void sortString(char **s,int len)
{
int i,j;
for(i = 0;i < len - 1;++i)
{
for(j = i + 1;j < len;++j)
{
if(strcmp(*(s + i),*(s + j)) > 0)
{
swap(s + i,s + j);
}
}
}
}