今天我主要学习了以下内容:字符串存储方式、数组指针、二维数组与数组指针的关系、函数指针数组的应用,以及如何用转移表实现计算器功能。下面为大家详细分享这些知识点。
1. 字符串指针
int main()
{
char* p = "abcdef"; // 定义指向字符串常量的指针
printf("%s", p); // 输出字符串内容
return 0;
}
2. 字符串存储方式比较
int main()
{
char str1[] = "abcdefg"; // 字符数组存储字符串
char str2[] = "abcdefg"; // 另一个字符数组
const char* str3 = "abcdefg"; // 指向字符串常量的指针
const char* str4 = "abcdefg"; // 指向相同字符串常量的指针
if (str1 == str2) // 比较数组地址(不同)
{
printf("we are same\n");
}
else
{
printf("we are not same\n");
}
if (str3 == str4) // 比较指针值(相同,编译器优化)
{
printf("we are same");
}
else
{
printf("we are not same");
}
}
3. 数组指针基础
int main()
{
int arr1[6] = {1,2,3,4,5,6};
int(*parr)[6] = &arr1; // 数组指针,指向包含6个int的数组
char ch1[7] = "abcdefg";
char (*pch)[7] = &ch1; // 字符数组指针,指向包含7个char的数组
}
4. 数组指针遍历数组
int main()
{
int arr1[7] = { 1,2,3,4,5,6,7 };
int (*p)[7] = &arr1; // 数组指针指向arr1
for (int i = 0; i < 7; i++)
{
printf("%d ", (*p)[i]); // 通过解引用数组指针访问元素
}
}
5. 二维数组与数组指针
void Print_mine(int(*p)[5], int r, int c)
{
for (int i = 0; i < 3; i++) // 行数
{
for (int j = 0; j < 5; j++) // 列数
{
printf("%d ", p[i][j]); // 等价于*(*(p + i) + j)
}
printf("\n");
}
}
int main()
{
int arr[3][5] = { {1,2,3,4,5}, {2,3,4,5,6}, {3,4,5,6,7} };
Print_mine(arr, 3, 5); // 传递二维数组
}
6. 函数指针基础
int Add(int x, int y) { return x + y; }
char test(char a, char b) { }
int main()
{
Add(3,6);
int (*p)(int, int) = &Add; // 函数指针指向Add函数
char(*p1)(char,int) = &test; // 另一个函数指针
}
7. 函数指针调用函数
int Add(int x, int y) { return x + y; }
int main()
{
int(*p)(int, int) = &Add;
int r = (*p)(6, 7); // 通过函数指针调用函数
printf("%d", r);
return 0;
}
8.复杂指针解析
// 将0强制转换为函数指针并调用
(*(void(*)())0)();
// 复杂函数声明:signal函数返回一个函数指针
void(*signal(int,void(*)(int)))(int);
// 使用typedef简化
typedef void(*pf)(int);
pf signal(int, pf);
9. 函数指针数组
int Add(int x, int y) { return x + y; }
int Div(int x, int y) { return x / y; }
int main()
{
int(*p1)(int, int) = Add;
int(*p2)(int, int) = Div;
// 函数指针数组,包含两个函数指针
int(*ad[4])(int, int) = { Add,Div };
}
10.计算器实现(转移表)
void menu()
{
printf("‌*****************************‌\n");
printf("‌*******1.加法 2.减法*******‌\n");
printf("‌*******3.乘法 4.除法*******‌\n");
printf("‌******* 0.退出计算器 ********‌\n");
printf("‌*****************************‌\n");
}
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; }
int main()
{
int x = 0, y = 0, input = 0, r = 0;
// 转移表:函数指针数组
int(*p[5])(int, int) = { NULL,Add,Sub,Mul,Div };
do {
printf("欢迎使用计算器,请选择模式\n");
menu();
scanf("%d", &input);
if (input > 0 && input < 5) {
printf("请输入两个整数\n");
scanf("%d %d", &x, &y);
if (input == 4 && y == 0) {
printf("除数不能为0,请重新输入\n");
break;
}
r = p[input](x, y); // 通过转移表调用函数
printf("结果为:%d\n", r);
}
else if (input == 0) {
printf("退出计算器\n");
return 0;
}
else {
printf("输入错误,请重新输入\n");
}
} while (input);
}