1.字符指针变量
有两种使用方法:
1.存储字符的地址
#include<stdio.h>
int main()
{
char a = 'A';
char* pa = &a;
printf("pa = %p\n", pa);
return 0;
}
2.存储常量字符串的地址,指针变量存储的仅仅是字符串首元素的地址。
#include<stdio.h>
int main()
{
char* pa = "I LOVE YOU!";
printf("pa = %p\n", pa);
return 0;
}
在C中会把常量字符串存储到单独的⼀块内存当中,如果有⼏个指针指向同⼀个字符串的时,他们实际上会指向同⼀块内存空间。但是⽤相同的常量字符串去初始化不同的数组时,就会开辟出不同的内存。
例如:《剑指offer》中的⼀道笔试题
#include <stdio.h>
int main()
{
char str1[] = "hello world.";
char str2[] = "hello world.";
const char *str3 = "hello world.";
const char *str4 = "hello world.";
if(str1 == str2)
{
printf("str1 and str2 are same\n");
}
else
{
printf("str1 and str2 are not same\n");
}
if(str3 == str4)
{
printf("str3 and str4 are same\n");
}
else
{
printf("str3 and str4 are not same\n");
}
return 0;
}
输出
str1 and str2 are not same
str3 and str4 are same
2.数组指针变量
深入理解指针(2)讲到了指针数组,是存放指针的数组
那数组指针,就是指向数组的指针了。
int arr[3] = {1,2,3};
int *p1[10] = {0};//指针数组
int(*p)[10] = &arr;
//数组指针,要加括号,因为[]优先级大于*
int (*p) [3] = &arr;
| | |
| | p指向数组的元素个数
| p是数组指针变量名
p指向的数组的元
C 运算符优先级表
3.⼆维数组传参的本质
整形一维数组的每个元素是整形元素,那么⼆维数组也可以看成是一个一维数组,只不过这个数组的每个元素是⼀维数组。数组传递参数的时候是传首元素地址,那二维数组传参是传第一个一维数组的地址,由前面所知,数组指针,所以形参可写成 int(*p)[5]来接收。
#include <stdio.h>
void test(int(*p)[5], int r, int c)
{
int i = 0;
int j = 0;
for (i = 0; i < r; i++)
{
for (j = 0; j < c; j++)
{
printf("%d ", *(*(p + i) + j));
}
printf("\n");
}
}
int main()
{
int arr[5][5] = { {1,2,3,4,5}, {1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5} };
test(arr, 5, 5);
return 0;
}
4.函数指针变量
函数指针变量是⽤来存放函数地址的,未来通过地址能够调⽤函数。
先输出一波函数地址
#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
int main()
{
int a = 10;
int b = 20;
printf("&add = %p\n", add);
printf("&add = %p\n", &add);
return 0;
}
输出:
&add = 003A1023
&add = 003A1023
要将函数的地址存放起来,就得创建函数指针变量
int (*p) (int a,int b) ——函数参数列表
| |
| 函数指针变量名
函数返回类型
#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
int main()
{
int a = 10;
int b = 20;
int (*p)(int a, int b) = &add;
printf("add(a,b) = %d\n", add(a,b));
printf("p(a,b) = %d\n", p(a,b));
return 0;
}
输出:
add(a, b) = 30
p(a, b) = 30
5. 函数指针数组
把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组
定义
int (*p[3])();
p先和[]结合,成为数组,
数组的内容int (*)()类型的函数指针
不能这样写 int (*)() p[3];会报错的
6.转移表
利用函数指针数组实现:简单计算器
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//加
int add(int a, int b)
{
return a + b;
}
//减
int sub(int a, int b)
{
return a - b;
}
//乘
int mul(int a, int b)
{
return a * b;
}
//除
int div(int a, int b)
{
return a / b;
}
//取余数
int rem(int a, int b)
{
return a % b;
}
int main()
{
int n = 0;
int (*p[5])(int a, int b) = { add,sub,mul,div,rem };
while(1)
{
printf("-----------计算器----------\n");
printf("---------1.加法 2.减-------\n");
printf("---------3.乘法 4.除-------\n");
printf("---------5.取余 0.退出-----\n");
printf("----------请输入:---------\n");
scanf("%d", &n);
if (n == 0)
{
break;
}
else
{
printf("请输入两个整数:\n");
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
printf("输出结果: %d\n", p[n - 1](a, b));
}
}
return 0;
}
有点意思。