指针数组
什么是指针数组呢?
名表其意:存放指针的数组
指针数组的每个元素是地址,可以指向一块区域
例:
int* parr[5];
char* pc[10];
指针数组的初始化:
#include<stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;
int* parr[5] = { &a,&b,&c,&d,&e };
for (int i = 0; i < 5; i++)
{
printf("%d", *(parr[i])); //遍历并打印数组
}
return 0;
}
知道了指针数组咋回事,那它怎么使用呢?
请看使用指针数组模拟实现二维数组:
#include<stdio.h>
int main()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 2,3,4,5,6 };
int arr3[] = { 3,4,5,6,7 };
int* parr[3] = { arr1,arr2,arr3 };
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 5; j++)
{
printf("%d ", parr[i][j]);
}
printf("\n");
}
return 0;
}
数组指针
数组指针是什么呢?
名表其意,数组指针是指向数组的指针,存放的是数组的地址
例:
int (*p) [10] = &arr;
数组类型 指针 指向的为数组
下面是一道有关数组指针的面试题(题源:《剑指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;
}
猜猜结果是什么(*'▽'*)♪
你答对了没?(错了也没关系(´•ω•`๑))
答案其实就针对一个知识点:对数组名的理解
数组名为数组首元素的地址(当数组名单独放在sizeof内部和&数组名时数组名为整个数组)
所以当str1,str2数组比较时,比较的时数组首元素的地址,由于是两块空间,所以数组首地址不同,而str3,str4为指针变量,指向常量字符串“abcdef”,由于是常量字符串(可看做数组),内容不可被更改,所以不用保存两次,只需向内存申请一块空间,str3,str4指向的地址相等。
补充(关于常量字符串):
char* p = "abcdefghi";
不是将字符串abcdefghi\0存放到p中
是将首字符a的地址存放在p中
"abcdefghi"是一个常量字符串,不能被修改若加入*p='q';则引发异常:写入访问权限冲突
若改为const char*p则*p直接报错
函数指针
函数指针是什么?
名表其意,函数指针也是一种指针,指向函数,存放的是函数的地址
例:
int (*p1)(int, int) = get_max;
int (*p1)(int, int) = &get_max;
p1为函数指针变量,两种写法均可
函数指针数组
什么是函数指针数组呢?
名表其意,存放函数指针的数组
例:
int Add(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}
int main()
{
int (*pArr[4])(int, int) = { Add,Sub };
return 0;
}
根据上述原理,可实现简易计算器(转移表)
#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;
}
void menu()
{
printf("*************************\n");
printf("********* 1.加 **********\n");
printf("********* 2.减 **********\n");
printf("********* 3.乘 **********\n");
printf("********* 4.除 **********\n");
printf("********* 0.退出*********\n");
printf("*************************\n");
}
int main()
{
int a = 1;
int(*pArr[5])(int, int) = { 0,Add,Sub,Mul,Div };
do
{
menu();
printf("请选择\n");
scanf("%d", &a);
if (a >= 1 && a <= 4)
{
int c = 0;
int b = 0;
int ret = 0;
printf("请输入你要计算的两个数\n");
scanf("%d %d", &b, &c);
ret = (pArr[a])(b, c);
printf("结果为%d\n", ret);
}
} while (a);
return 0;
}