C语言指针详解3

📅 2026/6/30 22:43:47
C语言指针详解3
一.字符指针变量在指针中有一种字符叫做char* 类型字符类型指针既可以指向字符们也可以指向字符串字符串首字符地址常用。1.1指向单个字符int main() { char ch w; char* pc ch; *pc w; return 0; }1.2指向字符串指向字符串首字符地址代码示例#include stdio.h int main() { char* p abcdef;//abcdef是常量字符串, 这里的赋值是把首字符a的地址赋值给p printf(%c\n, *p);//打印a printf(%s\n, p);//打印整个字符串 return 0; }1.3扩展-const修饰字符指针变量#include stdio.h int main() { char str1[] hello cpp; char str2[] hello cpp; const char* str3 hello cppt.; const char* str4 hello cpp.; if (str1 str2) printf(str1 and str2 are same\n);//a else printf(str1 and str2 are not same\n);//b if (str3 str4) printf(str3 and str4 are same\n);//c else printf(str3 and str4 are not same\n);//d return 0; }问打印abcd中的那两个语句。解答str1和str2没有用const修饰所以不是一个字符串两者比的是起始地址字符串首元素地址所以str1 ! str2,str3和str4用const修饰了所以是同一条字符串两者比较的是指针变量的内容所以打印b c。二.数组指针2.1数组指针和指针数组的区别数组指针是存放指针的数组。而之前提到的数组指针是一种指针变量。写法1.数组指针int* p[10]2.指针数组int(*p)[10]2.2数组指针的初始化int main() { int arr[10] { 1,2,3,4,5,6,7,8,9,10 };//整型数组 int (*p)[10] arr; char ch[5] { a, b };//字符数组 char (*p2)[5] ch; return 0; }三.二维数组传参的本质要想知道二维数组传参的本质就要先知道二维数组的本质二维数组的可以看作是一个由几个一维数组组成的数组及二维数组的每个元素都是一维数组那么二维数组的首元素即第一行就是一个一维数组。void print(int (*arr)[3], int row) { for (int i 0; i row; i) { for (int j 0; j 3; j) { printf(%d , arr[i][j]); } printf(\n); } } int main() { int arr[3][3] { {1, 2, 3},{4, 5, 6},{7, 8, 9} }; // 数组名退化为行指针 int(*)[3] print(arr, 3); return 0; }二维数组传参形参部分可以写成数组也可以向上面这个代码这样写成指针形式。四.函数指针3.1写法int(*pf)(int x,int y)拆解int - 返回类型*pf3) - 函数指针变量名 int x,int y) - 函数参数的类型和个数。3.2函数指针的使用#include stdio.h int sub(int x, int y) { return x - y; } int main() { int(*pf)(int, int) sub; printf(%d\n, (*pf)(3,2)); printf(%d\n, pf(3, 5)); return 0; }3.3函数指针的使用 - 转义表举例实现计算器#include stdio.h 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, y; //用户输入的两个操作数。 int input 1;//存储用户选择的操作内容初始化为1。 int ret 0;//存储运算结果。 //转移表定义一个函数指针数组用来存放加减乘除四个函数的地址。 int (*p[5])(int x, int y) { 0, add, sub, mul, div }; // do-while循环让程序可以重复运行直到用户选择退出 do { // 打印菜单界面 printf(************************\n); printf( 1:add 2:sub \n); printf( 3:mul 4:div \n); printf( 0:exit \n); printf(************************\n); printf(请选择: ); scanf(%d, input); // 读取用户输入的选项 // 如果用户选择的是1~4之间的运算 if ((input 4 input 1)) { printf(输入操作数); scanf(%d %d, x, y); // 读取两个操作数 // 通过函数指针数组调用对应的运算函数 ret (*p[input])(x, y); // 输出运算结果 printf(ret %d\n, ret); } // 如果用户选择0退出程序 else if (input 0) { printf(退出计算器\n); } // 输入的选项不在0~4范围内提示错误 else { printf(输入有误\n); } } while (input); // 只要input不为0循环就会继续 return 0; }七.typedef关键字typedef 用于给已有数据类型起别名简化复杂类型书写。#include stdio.h typedef int Integer; // 给int起别名Integer int main() { Integer a 10; printf(%d, a); return 0; }