数组指针的定义方式:
1、定义数组类型,根据类型定义指针变量
int a[10] = { 0 }; //1,定义数组类型,根据类型定义指针变量
typedef int A[10]; //A数组类型
A *p = NULL; //p数组指针类型变量
//p = a; //a代表首元素地址, a和&a一样,最终也是当作&a,警告
p = &a; //&a代表整个数组首地址
2、先定义数组指针类型,根据类型定义变量。
int a[10] = { 0 }; //2,先定义数组指针类型,根据类型定义变量。
typedef int(*P)[10]; //和指针数组写法很类似 多了()
P q; //()和[]优先级一样
q = &a; //指向数组的指针,它有typedef,所以它是一个数组指针类型
3、直接定义数组指针变量
int a[10] = { 0 }; //3,直接定义数组指针变量
int(*q)[10]; //指向数组的指针,没有typedef,所以它是一个数组指针变量
q = &a; //q是数组指针变量
数组地址概念:
二维数组名的地址含义
int a[4]; //a是首元素地址, &a是整个数组地址
int a[][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; //a是首行地址,&a是整个数组地址
//二维数组组名代表第0行的首地址(区别于第0行首元素地址,虽然值一样)
//a 代表第0行首地址
//a+i 代表第i行地址
//*(a+i) 等价于 a[i] 代表第i行首元素地址
//*(a+i)+j 等价于 &a[i][j] 第i行第j列元素地址
//*(*(a+i)+j ) 等价于a[i][j] 第i行第j列元素的值
二维数组的线性存储
int a[][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
int *b = a;
int i = 0;
for (i = 0; i < sizeof(a) / sizeof(a[0][0]); i++)
{
printf("%d \n", b[i]);//结果是1到12,证明了存储的线性
}
定义并打印一个数组指针
int a[][10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
typedef int(*P)[10];
P p;
p = a;
int i = 0;
int j = 0;
int n = sizeof(a) / sizeof(a[0]);
int nj = sizeof(a[0]) / sizeof(a[0][0]);
for (i = 0; i < n; i++)
{
for (j = 0; j < nj; j++)
{
printf("%d ", *(*(p + i) + j)); //printf("%d ", p[i][j]);
}
printf("\n");
}
//结果: 1 2 3 4 5 6 7 8 9 10
11 12 0 0 0 0 0 0 0 0
二维数组做形参的注意点见之前内容。注:不可直接使用二级指针,步长不一样。
指针函数
int *fun()//指针函数,即返回值是指针类型的函数
{
int *p = (int *)malloc(sizeof(int));
return p;
}
函数指针
int fun(int a)
{
printf("a============%d\n", a);
return 0;
}
int main()
{
//函数指针 它是指针 指向函数的指针
//定义函数指针变量有3种方式
//1 先定义函数类型 根据类型定义指针变量(不常用)
typedef int FUN(int a); //FUN函数类型 //有typedef是类型 没有是变量
FUN *p1 = NULL; //函数指针变量
p1 = fun; //p1指向fun函数
fun(5); //传统方式
p1(6); //函数指针变量调用方法
//2 先定义函数指针类型 根据类型定义指针变量(常用)
typedef int(*PFUN)(int a); //PFUN函数指针类型
PFUN p2 = fun;
p2(7);
//3 直接定义函数指针(常用)
int(*p3)(int a) = fun;
p3(8);
int(*p4)(int a);
p4 = fun;
p4(9);
printf("\n");
system("pause");
return 0;
}
函数指针的应用(多态)
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
void add()
{
printf("add11111111111111\n");
}
void minus()
{
printf("minus2222222222222\n");
}
void multi()
{
printf("multi33333333333333\n");
}
void divide()
{
printf("divide44444444444444\n");
}
void myexit()
{
exit(0);
}
int main()
{
//函数指针数组
void(*fun[5])() = { add, minus, multi, divide, myexit };
//指针数组
char *buf[] = { "add", "min", "mul", "div", "exit" };
char cmd[100];
int i = 0;
while (1)
{
printf("请输入指令:");
scanf("%s", cmd);
for (i = 0; i < 5; i++)
{
if (strcmp(cmd, buf[i]) == 0)
{
fun[i]();
break;//跳出for循环
}
}
}
printf("\n");
system("pause");
return 0;
}