提升方向:
1. **深入理解指针**:
指针的高级用法,包括指针的指针、函数指针、指针与数组、指针与结构体的深入应用等。
指针数组:本质是数组
1.指针数组的每个元素都是一个一级指针,每个元素都有自己独立的内存地址
2.应用于字符串数组或者动态数组中
const char* str[3] = { "abc", "123", "..." };
for (int i = 0; i < sizeof(str)/sizeof(char *) i++)
{
cout << str[i] << endl;
}
数组指针:本质是指针
1.数组指针指向第一个数组,每个元素都是一个数组
2.简化多维数组的操作和访问
3.函数参数传递,使函数能够接收多个维度的参数,如果实参是一个二维数组的话,形参可以用数组指针去接收
void prit(int (*str)[3], int rows)
{
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < 3; ++j) {
cout << str[i][j] << " ";
}
cout << endl;
}
}
int main()
{
int str[2][3] = { {1,2,34}, {2,3,5}};
prit(str, 2);
return 0;
}
指针函数:本质是函数,返回值类型是指针,修改返回值类型的
1.用于返回动态内存分配的返回内存指针
2.链表操作,用于返回新节点或者链表后的节点
3.字符串操作,返回字符串地址
#include <stdio.h>
#include <stdlib.h>
int* mymalloc()
{
int* ptr = (int*)malloc(sizeof(int)*5);
if (ptr == NULL)
{
return NULL;
}
return ptr;
}
int main()
{
int* nptr = mymalloc();
for (int i = 0; i< 5; i++)
{
nptr[i] = i;
printf("%d ", nptr[i]);
}
free(nptr);
nptr = NULL;
return 0;
}
函数指针:本质是指针,
1.用于回调函数中,一个函数调用另外一个
2.动态函数选择,可以在运行中动态选择哪个函数运行,配合函数数组使用
3.函数指针可以替代繁琐的Switch-case的使用,简化代码结构
回调函数例程,使用函数指针调用,使用回调机制
#include <iostream>
// 函数声明
void greetEnglish();
void greetSpanish();
void greetChinese();
// 定义函数指针类型
typedef void (*GreetFunction)();
void executeGreet(GreetFunction func) {
func(); // 调用函数指针指向的函数
}
int main() {
// 定义函数指针并赋值
GreetFunction greet = greetEnglish;
// 使用函数指针调用函数
greet();
// 修改函数指针指向的函数
greet = greetSpanish;
greet();
// 使用回调机制
executeGreet(greetChinese);
return 0;
}
void greetEnglish() {
std::cout << "Hello!" << std::endl;
}
void greetSpanish() {
std::cout << "Hola!" << std::endl;
}
void greetChinese() {
std::cout << "你好!" << std::endl;
}
动态函数选择
替代Switch - case
当然对于那种case里面只是一句话的就没必要用了,因为你也要创建大量的函数体
#include <stdio.h>
// 定义函数指针类型
typedef int (*operation_func)(int, int);
// 各种运算函数
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int multiply(int a, int b) {
return a * b;
}
int divide(int a, int b) {
return a / b;
}
int main() {
int a = 10, b = 5;
const char operator = '+';
// 函数指针数组
operation_func operations[256] = { NULL };
// 初始化函数指针数组
operations['+'] = add;
operations['-'] = subtract;
operations['*'] = multiply;
operations['/'] = divide;
// 选择并调用相应的函数
if (operations[(int)operator] != NULL) {
int result = operations[(int)operator](a, b);
printf("Result: %d\n", result);
}
else {
printf("Invalid operator\n");
return 1;
}
return 0;
}
结构体函数指针:功能函数列表
?????
值传递:
指针传递:
//指针传递
void fun(int *a, int *b)
{
int temp = 0;
temp = *a;
*a = *b;
*b = temp;
cout << "a=" << *a << endl << "b=" << *b << endl;
}
//值传递
void fun(int a, int b)
{
int temp = 0;
temp = a;
a = b;
b = temp;
cout << "a=" << a << endl << "b=" << b << endl;
}
2. **动态内存管理**:
深入了解动态内存分配、管理和优化。掌握 `malloc`, `calloc`, `realloc` 和 `free` 函数的使用,以及如何避免内存泄漏和碎片化。
3. **结构体**:
typedef struct{
int a;
int b;
char c;
}BASE;
BASE b = {
.a=100,
.b=20,
.c='a'
};
4. **算法优化**:
实现和优化各种算法,如排序算法、搜索算法、递归算法等。
5. **模块化和面向抽象编程**:
学习如何设计模块化的代码,使用抽象数据类型(ADT)和封装来提高代码的重用性和可维护性。
6. **系统级编程**:
包括与操作系统交互的编程,使用系统调用,进行进程管理、文件操作、信号处理等。
7. **多线程和并发编程**:
在C语言中使用多线程库如 POSIX Threads (pthreads) 进行并发编程,理解线程的创建、同步和通信机制。
10. **优化技术**:
学习使用编译器优化选项,理解编译器是如何处理你的代码的,以及手动优化代码的技巧。
11. **嵌入式和底层编程**:
对硬件接口编程,包括嵌入式系统中的C语言编程。