一维数组跟一级指针
第一种情况
int a[10] = {1,2,3,4,5,6,7,8,9};
int *p;
p=a; //p指向数组首元素
p+1 = &a[1];
第二种情况
int a[10] = {1,2,3,4,5,6,7,8,9}; //
int (*p)[10];
p = &a; //p指向数组块a
(*p)[1]; == a[1]
(*p)[2]; == a[2]
(*p)[3]; == a[3]
二组数组:
int arr[3][4];
int arr[][5] = {0}; //允许 因为他能让系统,知道初始化一维数组,里面要分割多少个区间
int arr[5][] = {0}; //不允许
int arr[][] = {0}; //不允许
int arr[3][4]; //允许
char ch[10][50]={"fsdfkjwel","fjweqlkfasd","ae3wre","ewtsdf"};
printf("ch[0] = %s\n",ch[0]);
arr数组名,指向首元素(第一个一维数组)指针
arr &arr &arr[0] == 数值一样,意义不一样
&arr[0] 与arr 意义一样的 表示指向首元素的指针(第一个一维数组)
&arr 指向整个二维数组的指针
int arr[3][4]={1,2,23,4,5,6,78,9,10}; //总长度48个字节
练习:1、求二维数组中,第一个一维数组之和
二维数组为4*5;
2、求二维数组n*n,两个对角线上数据之和
/*
错误定义
int n;
int a[n][n]; // == a[][];
scanf("%d",&n);
*/
/*
正确定义
int n;
scanf("%d",&n);
int a[n][n]; // == a[][];
*/
printf("arr = %p\n",arr);
printf("&arr = %p\n",&arr);
printf("&arr[0] = %p\n",&arr[0]);
printf("arr+1 = %p\n",arr+1);
printf("&arr+1 = %p\n",&arr+1);
printf("&arr[0]+1 = %p\n",&arr[0]+1);
arr = 0xbfa58640
&arr = 0xbfa58640
&arr[0] = 0xbfa58640
arr+1 = 0xbfa58650
&arr+1 = 0xbfa58670
&arr[0]+1 = 0xbfa58650
*(arr+0) //表示第一个一维数组,相当于一维数组的数组名
*(*arr) //arr[0][0]表示数组第一个元素的值arr[0][0]
*(arr+1) //表示第二个一维数组,即指向了第二个一维数组首元素地址(地址)
*(*(arr+1)) // *(*(arr+1)+0) == arr[1][0]
*(*(arr+1)+2) //arr[1][2];
3、用指针的方法来完成上述的两道题目
第一种情况
int a[4][5] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
int (*p)[5]; //要求下标跟二维数组的第5相同
p = a;
a[1]; // ==p[1] //地址
a[1][3]; // ==*(p[1]+3)
第二种情况
int a[4][5] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
int (*p)[4][5]; //要求下标跟二维数组的第5相同
p = &a;
a[3][4]; == (*p)[3][4]
a) 一个整形数 //int b
b) 一个指向整形的指针 //int *p; int为指针指向的数据类型
c)一个指向指针的指针,指向的指针是指向一个整型 //int **p;
d) 一个有10个整型数的数组 //int arr[10];
e) 一个有10个指针的数组,指针分别指向一个整型数 //指针数组 int *arr[10];
f) 一个指向有10个整型数数组的指针 // 数组指针 int (*arr)[10];
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数 //函数指针 int (*p)(int x);
h) 一个返回值为一个指针的函数,该函数有一个整型参数;// 指针函数 int *fun(int x);
i) 一个有10个指针的数组,各指针指向一个函数,函数有一个整形参数,并返回一个整型数。
//函数指针数组 int (*arr[10])(int x)
二级指针
int **p;//指针的指针 int **p = &i; 不正确的
int i = 5;
*p = &i;//正确的
指针函数
int *fun(int x);
函数指针
int add(int a,int b)
int (*p)(int x,int y)
p = &add;
(*p)(50,30);
函数指针数组
int add(int x,int y)
{
}
int sub(int x,int y)
{
}
int cmp_big_small(int x,int y)
{
}
int main(void)
{
int num;
int ((*arr[3])(int x,int y))={add,sub,cmp_big_small};
num = arr[0](30,60);
return 0;
}
练习:
1、写4个函数,用函数指针数组来关连,第一个函数,冒泡排序、验证码、加法、递归阶乘。
采用终端选择来选择不同功能函数./main n(n代码不同的函数,n值为1,2,3,4)
2、编写一个程序,去掉给定字符串串重复的字符,例如给定“google”,输出“gole”;
3、一个有N个元素的整型数组,数组的最大值是及最小值多少(用指针来做);
4、通过指针函数,输入一个数字1~7之间的整数,输出对应的星期名。
5、通过函数指针,实现二维数组对应角之和;