//关于指向数组的指针
#include <stdio.h>
//我们知道,将数组传入函数时,参数表写成数组形式本质上仍是指针(有些人称之为退化)
//其实可以看成一个语法糖
//比如以下四个函数中的参数写法 对于编译器来看 是一模一样的
//对编译器而已,最直接(经过最少转化)的写法是最后一种
void f10(int a[10]) //按照数组声明的形式(不带分号)
{
printf("%d\n", a[0]);
}
void f11(int a[99]) //方括号内可以填写任意非负数
{
printf("%d\n", a[0]);
}
void f12(int a[]) //方括号内不填数组
{
printf("%d\n", a[0]);
}
void f13(int *a) //指向数组元素的指针
{
printf("%d\n", a[0]);
}
//对于二维数组
//同理,对编译器来说最直观的写法是第四种,用指向数组的指针(俗称“行指针”)
void f20(int a[10][10]) //按照数组声明的形式
{
printf("%d\n", a[0][0]);
}
void f21(int a[99][10]) //第一个方括号内可以填写任意非负数
{
printf("%d\n", a[0][0]);
}
void f22(int a[][10]) //第一个方括号内不填
{
printf("%d\n", a[0][0]);
}
void f23(int (*a)[10]) //声明一个指针,这个指针指向一个 含有10个元素空间的数组
{
printf("%d\n", a[0][0]);
}
//对于三维数组
//同理,对编译器来说最直观的写法也是第四种,用指向数组(二维)的指针
void f30(int a[10][10][10]) //按照数组声明的形式
{
printf("%d\n", a[0][0][0]);
}
void f31(int a[99][10][10]) //第一个方括号内可以填写任意非负数
{
printf("%d\n", a[0][0][0]);
}
void f32(int a[][10][10]) //第一个方括号内不填
{
printf("%d\n", a[0][0][0]);
}
void f33(int (*a)[10][10]) //声明一个指针,这个指针指向一个 含有10*10个元素空间的数组(二维)
{
printf("%d\n", a[0][0][0]);
}
int main()
{
int a[10] = {9, 8};
f10(a);
f11(a);
f12(a);
f13(a);
printf("\n");
int b[10][10] = {9, 8};
f20(b);
f21(b);
f22(b);
f23(b);
printf("\n");
int c[10][10][10] = {9, 8};
f30(c);
f31(c);
f32(c);
f33(c);
printf("\n");
return 0;
}