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; }