问:
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.