数组的一些小常识
- 数组名代表数组首元素的地址,但有两种情况例外 &arr与sizeof(arr),表示着整个数组的长度
- 二维数组名代表着二位数组第一行的地址,第一行的地址是一维数组的地址,举个例子
int arr[3][4] = { 1,2,3,9,3,2,9,1,5,4,6,7 };
//*arr 相当于数组名 ,即第一行的首元素地址(1的地址),*(arr+1)表示第二行的首元素地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AcCWcRWP-1688463860442)(C:\Users\22724\AppData\Roaming\Typora\typora-user-images\image-20230701175304288.png)]
指针数组
指针数组其实是数组,里面存放的是指针。
int* arr[3] 表示存放着3个类型为 int * 的 数据的 数组,举个例子
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
int a[2] = { 1,2 };
int b[2] = { 0,1 };
int c[2] = { 1,2 };
int* arr[3] = { a,b,c };
printf("%d", *arr[2]);//打印的结果是c里面的1, arr[2]表示数组c的首元素地址
}
数组指针
数组指针表示的是指向数组的指针。二维数组的数组指针存放着二维数组第一行的数组的地址
int (*p)[10];
数组指针往往用于二维数组在函数中的传递。举个例子:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void print(int (*p)[4], int x, int y)//*(p+i)相当于于p[i] *p相当于p[]
{
for (int a = 0; a < x; ++a)
{
for (int b = 0; b < y; ++b)
{
printf("%d ", *(*(p+a)+b));
}
printf("\n");
}
}
int main(void)
{
int arr[3][4] = { 1,2,3,9,3,0,9,1,5,4,6,7 };
print(arr, 3, 4);//二维数组的arr表示第一行的所有元素,它是个一维数组的地址,arr[0]表示第一行的首元素地址
}
函数指针
函数指针是用来接收函数名的指针
Add (int x , int y)是个加法函数
int (*ptr)(in x , int y) = Add; 指针的类型 int( * ) (int , int )
则ptr里面保存着Add的地址,因此可以用ptr或者ptr*直接调用Add,
#define _CRT_SECURE_NO_WARNINGS 1
函数指针解决代码冗余度
#include<stdio.h>
void mnue()
{
printf("0.加法 1.减法 2.乘法 3.退出\n");
}
int Add(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}
int Muti(int x, int y)
{
return x - y;
}
void calu(int(*ptr)(int x,int y))//将函数名传进来,用int(*)(int x , int y)类型的函数指针来接受
{
printf("请输入两个数\n");
int x;
int y;
scanf("%d %d", &x, &y);
int ret = ptr(x, y);
printf("%d", ret);
}
int main(void)
{
mnue();
int input;
scanf("%d", &input);
do {
switch (input)
{
case 1:
calu(Add);
break;
case 2:
calu(Sub);
break;
case 3:
calu(Muti);
break;
case 4:
break;
default:
break;
}
} while (input);
}
函数指针数组
函数指针数组其实是数组,里面存放着函数指针
int(*arr[3])(int x, int y) = {Add,Sub,Muti};
那么函数指针数组的指针是什么呢?
首先这个指针的类型必须和数组里面元素的指针类型相同, 那么类型为int ( * )(int x , int y),数组的地址,是一维数组的全部元素,那么就是(*parr)[3].
则这个指针为int(* (*)parr[3] )(int x , int y) = &arr;