问:
1. ( ),[ ],->,++,--,. ,*的操作符优先级是怎么样的?
2. Solve the problems:只有一个常量字符串与一个字符指针,该怎么打印常量字符串所有内容?
3. 常量字符串在内存里面是怎么样的?且怎么样?如果相同常量字符串被应用很多次,但内存里面怎么样?
4. 指针数组是什么?
5. 数组指针是什么?经常应用在什么地方?
6. 二维数组的首元素是什么?也就是什么?二维数组的数组名是什么?也就是什么?因此就是什么?
7. Solve the problems:已知一个二维数组,想计算它的行数与列数,并用数组指针打印二维数组该怎么办呀?
8. 函数指针是什么?函数指针数组是什么?函数指针数组的限制是什么?
9. Solve the problems:想用转移表来写一个简易的整数加减乘除计算器,该怎么写?
10. Solve the problems:想调用0地址处的一个函数该怎么办呀?
11. Solve the problems:想声明一个函数,该函数的两个参数分别是整型和函数指针,返回一个函数指针,该怎么办呀?
12. 画一张图解释一下什么是回调函数?
13. Solve the problems:有一堆整数,我想排序一下怎么办?
14. Solve the problems:有一些结构体,我想按照不同成员分别排序一下怎么办?
15. 对于void,可以用哪两个词语形容它?
16. qsort函数参数里面的比较函数的参数是什么?返回值是怎么确定的?
17. Solve the problems:我想用冒泡排序内核来实现qsort函数,该怎么办?
18. 画出有关指针与内存等的思考框架图?
答:
1. ( ) > [ ] > -> > ++ > -- > . > *
2.
//解决方法: int main() { char* p = &"Elon Musk"; int sz = strlen("Elon Musk"); int
i = 0; for (i = 0; i < sz; i++) { printf("%c", *(p + i)); } return 0; }
3. 连续存储的,无法修改,只会存一份。
4. 存放一个个指针的数组。
5. 指向数组的指针,二维数组。
6. 第一行,一个一维数组,首元素的地址,一维数组的地址,数组指针。
7.
//解决方法 int main() { int arr[][3] = { 1,4,5,2,3,4,5,1,2,7,9,7,5,0 }; int row =
sizeof(arr) / sizeof(arr[0]); int col = sizeof(arr[0]) / sizeof(arr[0][0]); int
i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) {
printf("%d ", *(*(arr + i) + j)); } printf("\n"); } return 0; }
8. 指向函数的指针,存放一个个函数指针的数组,每个函数指针指向的函数其“规格”要一模一样。
9.
//解决方法: int add(int x, int y) { return x + y; } int sub(int x, int y) { return
x - y; } int mul(int x, int y) { return x * y; } int div(int x, int y) { return
x / y; } void menu() { printf("******* 1. add 2. sub 3. mul 4. div 0. exit
*******\n"); } int main() { int x = 0; int y = 0; int ret = 0;
int(*arr[5])(int, int) = { 0,add,sub,mul,div }; int input = 0; do { menu();
printf("请输入:"); scanf("%d", &input); if (input == 0) { printf("退出成功\n"); break;
} else if (input > 4) { printf("输入错误,重新输入\n"); } else { printf("请输入两个操作数:");
scanf("%d %d", &x, &y); ret = (*(arr + input))(x, y); printf("结果为:%d\n", ret);
} } while (input); return 0; }
10.
(*(void(*)())(0))();
11.
void(*signal(int, void(*)(int)))(int);
12.
13.
//解决方法 int cmp_int(const void* e1, const void* e2) { return (*(int*)e1) -
(*(int*)e2); } int main() { int arr[] = { 12,34,23,67,54,90,78,99,21,53,70 };
int sz = sizeof(arr) / sizeof(arr[0]); qsort(arr, sz, sizeof(arr[0]), cmp_int);
int i = 0; for (i = 0; i < sz; i++) { printf("%d ", *(arr + i)); } return 0; }
14.
//解决方法 struct Stu { char name[20]; int age; float score; }; int
cmp_by_score(const void* e1, const void* e2) { return ((struct Stu*)e1)->score
- ((struct Stu*)e2)->score; } int cmp_by_name(const void* e1, const void* e2) {
return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name); } int main() {
struct Stu arr[5] = { {"wang",23,95.2} ,{"ye",20,96.3} ,{"shen",29,91.2}
,{"hu",25,90.8} ,{"Elon",51,99.9} }; int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_by_score); printf("按成绩排名:\n"); int i = 0;
for (i = 0; i < sz; i++) { printf("%7s %3d %.3f\n", (*(arr + i)).name, (*(arr +
i)).age, (*(arr + i)).score); } qsort(arr, sz, sizeof(arr[0]), cmp_by_name);
printf("按姓名排名:\n"); for (i = 0; i < sz; i++) { printf("%7s %3d %.3f\n", (*(arr
+ i)).name, (*(arr + i)).age, (*(arr + i)).score); } return 0; }
15. 瞎子,垃圾桶。
16. 相邻数组元素的起始地址,根据要比较的实际数据大小确定。
17.
//解决方法 void Swap(char* e1, char* e2, size_t width) { int i = 0; for (i = 0; i
< width; i++) { char tmp = *(e1 + i); *(e1 + i) = *(e2 + i); *(e2 + i) = tmp; }
} void my_qsort(void* base, size_t num, size_t width, int(*cmp)(const void*,
const void*)) { int i = 0; int j = 0; for (i = 0; i < (num - 1); i++) { for (j
= 0; j < (num - i - 1); j++) { if (cmp((char*)base + j * width, (char*)base +
(j + 1) * width) > 0) { Swap((char*)base + j * width, (char*)base + (j + 1) *
width, width); } } } } struct Stu { char name[20]; int age; float score; }; int
cmp_by_score(const void* e1, const void* e2) { return ((struct Stu*)e1)->score
- ((struct Stu*)e2)->score; } int cmp_by_name(const void* e1, const void* e2) {
return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name); } int main() {
struct Stu arr[5] = { {"wang",23,95.2} ,{"ye",20,96.3} ,{"shen",29,91.2}
,{"hu",25,90.8} ,{"Elon",51,99.9} }; int sz = sizeof(arr) / sizeof(arr[0]);
my_qsort(arr, sz, sizeof(arr[0]), cmp_by_score); printf("按成绩排名:\n"); int i = 0;
for (i = 0; i < sz; i++) { printf("%7s %3d %.3f\n", (*(arr + i)).name, (*(arr +
i)).age, (*(arr + i)).score); } my_qsort(arr, sz, sizeof(arr[0]), cmp_by_name);
printf("按姓名排名:\n"); for (i = 0; i < sz; i++) { printf("%7s %3d %.3f\n", (*(arr
+ i)).name, (*(arr + i)).age, (*(arr + i)).score); } return 0; }
18.