嵌入式开发第7日(数组与指针)

来源:互联网 发布:大屏数据 编辑:程序博客网 时间:2024/06/04 23:24

一维数组跟一级指针

第一种情况
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、通过函数指针,实现二维数组对应角之和;






















0 0
原创粉丝点击