(1)连续定义两个指针时,要这样定义: int *p,*q;
若定义为这样:int* p,q;则表示p为指针,q类型为In
我们来看一下这句代码:
const int num=0;
在这句代码中,num被const 修饰,它的值不可被修改,那么,便产生了一个问题:此时num是常量还是变量呢?
ans:在C语言中,这个num是个常变量,但num的本质还是个变量,由于有const 的修饰,编译 器在语法上不允许修改这个变量。
而在C++中,这里的num则为常量。
我们可以看一下下面的代码证明:
const int num=0;
int arr[num];
在C99之前,是不支持变长数组的操作的,由于arrr[n]中的n要求是常量才可以完成编译,所以当我们在VS上面进行调试的时候,如果我们选择的是.c文件,则会报错,若选择的是.cpp文件,则不会报错。
#include <stdio.h>
int main()
{
int arr[10] = { 0,5,6,9,2,3,8,4,7,1 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++) //趟数
{
int j = 0;
for(j = 0; j < sz - 1 - i; j++) //一趟的细节
{
if (arr[j] < arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
1.如何去写函数指针数组
int sum(int a, int b)
{
int c = a + b;
return c;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
int div(int a, int b)
{
return a / b;
}
int main()
{
printf("******************************************************\n");
printf("**************** 0.exit **************\n");
printf("**************** 1.sum **************\n");
printf("**************** 2.sub **************\n");
printf("**************** 3.mul **************\n");
printf("**************** 4.div **************\n");
int a,b;
int input;
scanf_s("%d", &input);
switch (input)
{
case 0:
printf("退出计算器\n");
break;
case 1:
scanf_s("%d %d", &a, &b);
printf("%d", sum(a,b));
break;
case 2:
scanf_s("%d %d", &a, &b);
printf("%d", sub(a,b));
break;
case 3:
scanf_s("%d %d", &a, &b);
printf("%d", mul(a,b));
break;
case 4:
scanf_s("%d %d", &a, &b);
printf("%d", div(a,b));
break;
default:
printf("请重新输入");
}
return 0;
}
使用转移表简化后:
int sum(int a, int b)
{
int c = a + b;
return c;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
int div(int a, int b)
{
return a / b;
}
int main()
{
printf("******************************************************\n");
printf("**************** 0.exit **************\n");
printf("**************** 1.sum **************\n");
printf("**************** 2.sub **************\n");
printf("**************** 3.mul **************\n");
printf("**************** 4.div **************\n");
int(*pfarr[5])(int,int) = {0,sum,sub,mul,div};
int input = 0;
scanf_s("%d", &input);
if (input >= 1 && input <= 4)
{
do
{
int a = 0, b = 0;
int t = 0;
scanf_s("%d %d", &a, &b);
t = (*pfarr[input])(a, b);
printf("%d\n", t);
break;
} while (input);
}
else if (input == 0)
{
printf("exit\n");
}
else
{
printf("wrong!\n");
}
}
简述:回调函数起中间商的作用
2.应用
这个为简化之前
int sum(int a, int b)
{
int c = a + b;
return c;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
int div(int a, int b)
{
return a / b;
}
int main()
{
printf("******************************************************\n");
printf("**************** 0.exit **************\n");
printf("**************** 1.sum **************\n");
printf("**************** 2.sub **************\n");
printf("**************** 3.mul **************\n");
printf("**************** 4.div **************\n");
int a,b;
int input;
scanf_s("%d", &input);
switch (input)
{
case 0:
printf("退出计算器\n");
break;
case 1:
scanf_s("%d %d", &a, &b);
printf("%d", sum(a,b));
break;
case 2:
scanf_s("%d %d", &a, &b);
printf("%d", sub(a,b));
break;
case 3:
scanf_s("%d %d", &a, &b);
printf("%d", mul(a,b));
break;
case 4:
scanf_s("%d %d", &a, &b);
printf("%d", div(a,b));
break;
default:
printf("请重新输入");
}
return 0;
}
这个为简化后
int sum(int a, int b)
{
int c = a + b;
return c;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
int div(int a, int b)
{
return a / b;
}
void calc(int (*pf)(int a, int b))
{
int a, b;
int r = 0;
scanf_s("%d %d", &a, &b);
r = pf(a, b);
printf("%d", r);
}
int main()
{
printf("******************************************************\n");
printf("**************** 0.exit **************\n");
printf("**************** 1.sum **************\n");
printf("**************** 2.sub **************\n");
printf("**************** 3.mul **************\n");
printf("**************** 4.div **************\n");
int input;
scanf_s("%d", &input);
int r = 0;
switch (input)
{
case 0:
printf("退出计算器\n");
break;
case 1:
calc(sum);
break;
case 2:
calc(sub);
break;
case 3:
calc(mul);
break;
case 4:
calc(div);
break;
default:
printf("请重新输入");
}
return 0;
}
我们将其拆解一下:
这个为函数部分,不可省略
int sum(int a, int b)
{
int c = a + b;
return c;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
int div(int a, int b)
{
return a / b;
}
这个为回调函数部分,用于简化代码,起中间商的作用
void calc(int (*pf)(int a, int b))
{
int a, b;
int r = 0;
scanf_s("%d %d", &a, &b);
r = pf(a, b);
printf("%d", r);
}
这个为函数主体部分
int main()
{
printf("******************************************************\n");
printf("**************** 0.exit **************\n");
printf("**************** 1.sum **************\n");
printf("**************** 2.sub **************\n");
printf("**************** 3.mul **************\n");
printf("**************** 4.div **************\n");
int input;
scanf_s("%d", &input);
int r = 0;
switch (input)
{
case 0:
printf("退出计算器\n");
break;
case 1:
calc(sum);
break;
case 2:
calc(sub);
break;
case 3:
calc(mul);
break;
case 4:
calc(div);
break;
default:
printf("请重新输入");
}
return 0;
}
1.简介:qsort是库函数,它可以实现任意类型数据的排序,快速排序,其底层使用了回调函数的 方式,头文件为<stdlib.h>
z2.解释
void qsort(void* base, //base中存放的是待排序数组的第一个元素地址
size_t num, //num存放的是base指向的数组中的元素个数
size_ size, //size是base指向的数组中一个元素的长度,单位是字节
int(*compare)(const void*e1,const void*e2) //函数指针—指向了一个比较函数,这个
比较函数是用来比较数组中两个元素的
//如果e1指向的元素大于e2指向的元素,那么函数返回>0的数字
//如果e1指向的元素等于e2指向的元素,那么函数返回0
//如果e1指向的元素小于e2指向的元素,那么函数返回<0的数字
3.实例
3.1使用后qsort改良冒泡排序后
#include <stdlib.h>
#include <stdio.h>
int cmp(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2; //由于此处是升序,故e1-e2,若排降序,则e2-e1
}
void print(int arr[],int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[10] = { 0,5,6,9,2,3,8,4,7,1 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp);
print(arr,sz);
return 0;
}
使用动态内存管理后在升级一下(不懂的可以暂时跳过,后续文章会讲)!
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int cmp(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
int main()
{
int n = 0;
scanf_s("%d", &n);
int* p = (int*)malloc(4 * n);
for (int i = 0; i < n; i++)
{
scanf_s("%d", (p + i));
}
qsort(p, n, 4, cmp);
for (int i = 0; i < n; i++)
{
printf("%d", p[i]);
}
free(p);
p = NULL;
return 0;
}
3.2使用 qsort排序其他类型的数据
(1)以年龄来排序
#include<stdio.h>
#include<stdlib.h>
struct stu
{
char name[20];
int age;
};
int cmp_by_age(const void* e1, const void* e2)
{
return (*(struct stu*)e1).age - (*(struct stu*)e2).age;
}
int main()
{
struct stu s[3] = { {"zhangsan",56},{"lisi",12},{"wangwu",16} }; //此处为结构体数组
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]), cmp_by_age);
for (int i = 0; i < 3; i++)
{
printf("%s %d\n", s[i].name, s[i].age);
}
return 0;
}
最后的打印部分这样写也行
struct s
{
char name[100];
int age;
};
int cmp_by_age(const void* e1, const void* e2)
{
return (*(struct s*)e1).age - (*(struct s*)e2).age;
}
void print(struct s* s1)
{
for (int i = 0; i < 3; i++)
{
printf("%s %d\n", s1[i].name, s1[i].age);
}
}
int main()
{
struct s s1[3] = { {"syn",20},{"zmy",18},{"dl",22} };
int sz = sizeof(s1) / sizeof(s1[0]);
qsort(s1, sz, sizeof(s1[0]), cmp_by_age);
print(s1);
return 0;
}
结果如下
(2)以名字来排序
由于名字是字符串,不能直接使用>比较,应该使用strcmp函数比较大小,头文件<string.h>
strcmp(字符串1,字符串2)
如果字符串1大于字符串2,返>0的数字
如果字符串1大于字符串2,返0
如果字符串1大于字符串2,返<0的数字
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct stu
{
char name[20];
int age;
};
int cmp_by_name(const void* e1, const void* e2)
{
return strcmp((*(struct stu*)e1).name, (*(struct stu*)e2).name);
}
int main()
{
struct stu s[3] = { {"zhangsan",56},{"lisi",12},{"wangwu",16} };
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]), cmp_by_name);
for (int i = 0; i < 3; i++)
{
printf("%s %d\n", s[i].name, s[i].age);
}
return 0;
}
因篇幅问题不能全部显示,请点此查看更多更全内容