当前位置: 首页 > news >正文

(C语言)指针进阶

问:

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.

http://www.lryc.cn/news/3999.html

相关文章:

  • DS期末复习卷(三)
  • Java链表模拟实现+LinkedList介绍
  • MySQL——单表、多表查询
  • 关于表的操作 数据库(3)
  • C++:红黑树
  • 每天一道算法题の中缀表达式
  • Dar语法基础-泛型
  • rt-thread------串口(一)配置
  • Android - 自动系统签名
  • SSH 服务详解 (八)-- vscode 通过 SSH 远程连接 linux 服务器
  • 【PTA Advanced】1060 Are They Equal(C++)
  • 仿真与测试:通过Signal Builder模块生成输入信号
  • 云计算培训靠谱吗?
  • 力扣SQL刷题10
  • 31 岁生日快乐,Linux!
  • 分布式ID生成方案
  • 合宙Air103|fbd数据库| fskv - 替代fdb库|LuatOS-SOC接口|官方demo|学习(16):类redis的fbd数据库及fskv库
  • 【论文精读】Deep Residual Learning for Image Recognition
  • Lesson2:基础语法、输出输入
  • android 9.0去掉前置摄像头闪光灯功能
  • 静态分析工具Cppcheck在Windows上的使用
  • 用一年时间脱胎换骨
  • 全景拼接python旗舰版
  • (C语言)常见的字符串与内存操作函数
  • Linux基础笔记总结
  • R语言学习笔记
  • 【软件测试】企业测试面试题9道,从自我介绍到项目考察+回答......
  • 《Spring源码深度分析》第8章 数据库连接JDBC
  • ModuleNotFoundError的解决方案【已解决】
  • Vue驼峰与短横线分割命名中有哪些坑