数组指针
一维数组遍历
一维数组使用指针数组
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int(*pa)[10] = &arr;
// 方法一
for(int i = 0; i < 10; ++i)
{
printf("%d ", (*pa)[i]);
}
// 方法二
for (int i = 0; i < 10; ++i)
{
printf("%d ", *(*pa + i));
}
二维数组遍历(传入数组)
二维数组遍历(传入数组) 参数是数组形式
例如:下面这种遍历一个二维数组。
void print(int arr[3][5], int x, int y)
{
for (int i = 0; i < x; ++i)
{
for(int j = 0; j < y; ++j)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
int main()
{
int arr[3][5] =
{
{1,2,3,4,5},
{2,3,4,5,6},
{3,4,5,6,7},
};
print(arr, 3, 5);
}
总结:数组名就是首元素地址 把二维数组当成一维数组 第一行就是首元素地址
第一行又是一位数组,有五个元素,每个都是整形
二维数组遍历(用数组指针)
从图中可以得出arr[i] == *(arr + i) == *(p + i) == p[i]。那么二维数组也可以拿这四种方式表示。
void print(int(*p)[5], int x, int y)
{
for (int i = 0; i < x; ++i)
{
for (int j = 0; j < y; ++j)
{
// p + i表示跳到第i行,
// *(p+i)表示第i行的首地址,相当于数组名
printf("%d ", (*(p + i)[j]));
// p + i 找到那一行 *(p + i)那一行首地址
// (*(p + i) + j) 找到那行那列的地址 然后解析
printf("%d ", *(*(p + i) + j));
printf("%d ", *(p[i] + j));
printf("%d ", p[i][j]);
}
}
}
函数指针数组
再举一个更为复杂一点的例子,
加入参数传入和函数返回值。那么此时我们发现,重定义的语句我们需要改了,要改成 typedef int (*fun) (void); 因为元素的类型是返回int类型的,就是说这个函数指针是指向一个返回值为int类型的函数,那么我们定义的这个型类型也就需要加上int。代码如下。
int my_print1(int a) {
printf("This is printf1!, number is :%d\n", a);
return 1;
}
int my_print2(int b) {
printf("This is printf2!, number is :%d\n", b);
return 2;
}
int my_print3(int c) {
printf("This is printf3!, number is :%d\n", c);
return 3;
}
typedef int (*fun) (int d);
fun cortex[3] = { my_print1 ,my_print2 ,my_print3 };
int main(void) {
int a = cortex[0](8); //简单调用一下函数,没有返回值,没有输入参数
int b = cortex[2](6);
printf("a = %d, b = %d \n", a, b);
return 0;
}
结果如下:
This is printf1!, number is :8
This is printf3!, number is :6
a = 1, b = 3
函数指针:int (*pa)(int, int) = Add;//mul div sub
函数指针数组:int (*parr[4])(int, int) = { Add,Sub,Mul,Div };
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 main()
{
int (*pa)(int, int) = Add;//存放单个函数地址
// 现在需要一个数组,这个数组可以存放四个函数地址
int (*parr[4])(int, int) = { Add, Sub, Mul, Div };
// 使用方法1
printf("%d\n", (*parr[1])(6, 2));
// 使用方法2
printf("%d\n", parr[2](6, 2));
return 0;
}