Hi,欢迎来到中国优发娱乐手机版高端品牌 - 华清远见嵌入式学院<北京总部官网>,专注嵌入式工程师培养13年!
  • 全国咨询热线:400-611-6270
  • 新浪微博
  • 微信
  • 北京
    校区
  • 上海
    校区
  • 深圳
    校区
  • 成都
    校区
  • 南京
    校区
  • 武汉
    校区
  • 西安
    校区
  • 广州
    校区
  • 沈阳
    校区
  • 济南
    校区
  • 重庆
    校区
  • 长沙
    校区
  • 研发
    中心
  • 当前位置: > 嵌入式学院 > 嵌入式学习 > 讲师博文 > 嵌入式指针数组
    嵌入式指针数组
    时间:2017-09-07作者:华清远见
    题目:指针数组,数组指针,指针函数及函数指针相关的辨析   首先我们要明确: “指针数组”是数组,“数组指针”是指针。指针数组的每个数组元素都是一个指针,而数组指针是指向一个数组的指针。 “指针函数”与“函数指针”容易搞错,最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。指针函数本质是一个函数,函数返回类型是某一类型的指针。函数指针则是一个指针,指向声明中规定的返回值和参数类型及个数严格一致的函数。   指针数组: 在我们讲解指针数组的概念之前,先让我们来看一个实例,它用到了一个由 3 个整数组成的数组: 实例 #include <stdio.h>  const int MAX = 3;  int main () {     int  var[] = {1,2,3};     int i;     for (i = 0; i < MAX; i++)     {        printf("Value of var[%d] = %d\n", i, var[i] );     }     return 0; } 当上面的代码被编译和执行时,它会产生下列结果: Value of var[0] = 1 Value of var[1] = 2 Value of var[2] = 3 可能有时我们想要让数组存储指向 int或 char 或其他数据类型的指针。下面是一个指向整数的指针数组的声明: int *ptr[MAX]; 在这里,把 ptr 声明为一个数组,由 MAX 个整数指针组成。因此,ptr 中的每个元素,都是一个指向 int 值的指针。下面的实例用到了三个整数,它们将存储在一个指针数组中,如下所示: #include <stdio.h>  const int MAX = 3;  int main () {    int  var[] = {1, 2, 3};    int i, *ptr[MAX];      for ( i = 0; i < MAX; i++)    {       ptr[i] = &var[i]; /* 赋值为整数的地址 */    }    for ( i = 0; i < MAX; i++)    {       printf("Value of var[%d] = %d\n", i, *ptr[i] );    }    return 0; } 当上面的代码被编译和执行时,它会产生下列结果: Value of var[0] = 1 Value of var[1] = 2 Value of var[2] = 3 您也可以用一个指向字符的指针数组来存储一个字符串列表,如下: 实例 #include <stdio.h>  const int MAX = 4;  int main () {    char *names[] = {                    "hello!",                    "we",                    "are",                    "changke",    };    int i = 0;     for ( i = 0; i < MAX; i++)    {       printf("Value of names[%d] = %s\n", i, names[i] );    }    return 0; } 当上面的代码被编译和执行时,它会产生下列结果: Value of names[0] = hello! Value of names[1] = we Value of names[2] = are Value of names[3] = changke   数组指针: 定义如下的指针变量:        int (*p)[3];  指针p为指向一个由3个元素所组成的整型数组指针。在定义中, 圆括号是不能少的, 否则它是指针数组, 这将在后面介绍。这种数组的指针不同于前面介绍的整型指针, 当整型指针指向一个整型数组的元素时, 进行指针(地址)加1运算, 表示指向数组的下一个元素, 此时地址值增加了4(因为放大因子为4), 而如上所定义的指向一个由3个元素组成的数组指针, 进行地址加1运算时, 其地址值增加了12(放大因子为4x3=12), 这种数组指针用得较少, 但在处理二维数组时, 还是很方便的。 (二维数组指针---行指针) 例如:            int a[3][4], (*p)[4];            p=a;      开始时p指向二维数组第0行, 当进行p+1运算时, 根据地址运算规则, 此时放大因子为4x4=16, 所以此时正好指向二维数组的第1行。和二维数组元素地址计算的规则一样, *p+1指向a[0][1], *(p+i)+j则指向数组元素a[i][j]。       例     int a[3][4]={       {1,3,5,7},       {9,11,13,15},       {17,19,21,23}      };      int main()      {           int i,(*b)[4];           b=a+1;                  /* b指向二维数组的第1行, 此时*b[1]或                                       **b是a[1][0] */           for(i=1;i<=4;b=b[0]+2,i++) {/* 修改b的指向, 每次增加2 */              printf("%d\t",*b[0]);   }          printf("\n");           for (i=0; i<2; i++) {              b=a+i;               /* 修改b的指向, 每次跳过二维数组的一行 */              printf("%d\t",*(b[i]+1));           }           printf ("\n");       }      程序运行结果如下:       9    13   17   21       3    11   19   注意指针函数与函数指针表示方法的不同,千万不要混淆。   指针函数: 类型标识符 *函数名(参数表)int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。当然了,由于返回的是一个地址,所以类型说明符一般都是int。 表示: float *fun(); float *p; p = fun(a); 例如: int *GetDate(); int * aaa(int,int); 函数返回的是一个地址值,经常使用在返回数组的某一元素地址上。  int * GetData(int i,int j);  int main(){     int i,j;     do{      printf(“Enter i(1-5),j(1-7)\n”);      scanf(“%d%d”,&i,&j);     }while(i<1 || i>5 || i<1 || j>7);     printf(“%d\n”,*GetDate(i,j));//输出的是地址 }    int * GetData(int i,int j)  {    static int calendar[5][7]=    {      {1,2,3,4,5,6,7},      {8,9,10,11,12,13,14},      {15,16,17,18,19,20,21},      {22,23,24,25,26,27,28},      {29,30,31,32,33,34,35}    };    return &calendar[i-1][j-1]; } 程序应该是很好理解的,子函数返回的是数组某元素的地址。输出的是这个地址里的值。   函数指针: 函数指针是指向函数的指针变量。通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。函数指针可以像一般函数一样,用于调用函数、传递参数。函数指针变量的声明: typedef int (*fun_ptr)(int,int);  // 声明一个指向同样参数、返回值的函数指针类型 以下实例声明了函数指针变量 p,指向函数 max: #include <stdio.h>  int max(int x, int y) {     return x > y ? x : y; } int main(void) {     /* p 是函数指针 */     int (* p)(int, int) = & max; // &可以省略     int a, b, c, d;     printf("请输入三个数字:");     scanf("%d %d %d", & a, & b, & c);      /* 与直接调用函数等价,d = max(max(a, b), c) */     d = p(p(a, b), c);      printf("最大的数字是: %d\n", d);     return 0; } 编译执行,输出结果如下: 请输入三个数字:1 2 3 最大的数字是: 3   *回调函数* 函数指针作为某个函数的参数。函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。简单讲,回调函数是由别人的函数执行时调用你实现的函数。 实例中 populate_array 函数定义了三个参数,其中第三个参数是函数的指针,通过该函数来设置数组的值。定义了回调函数 getNextValue,它返回一个随机值,它作为一个函数指针传递给 populate_array 函数。populate_array 将调用 10 次回调函数,并将回调函数的返回值赋值给数组。 实例 #include <stdlib.h>   #include <stdio.h> // 回调函数 void populate_array(int *array, size_t arraySize, int (*getNextValue)(void)) {     for (size_t i=0; i<arraySize; i++) {         array[i] = getNextValue(); } // 获取随机值 int getNextValue(void) {     return rand(); } int main(void) {     int myarray[10];     populate_array(myarray, 10, getNextValue);     for(int i = 0; i < 10; i++) {         printf("%d ", myarray[i]);     }     printf("\n");     return 0; } 编译执行,输出结果如下: 16807 282475249 1622650073 984943658 1144108930 470211272 101027544 1457850878 1458777923 2007237709

    发表评论
    全国咨询电话:400-611-6270,双休日及节假日请致电值班手机:15010390966 在线咨询: 曹老师QQ(3337544669), 徐老师QQ(1462495461), 刘老师 QQ(3108687497) 企业培训洽谈专线:010-82600901,院校合作洽谈专线:010-82600350,在线咨询:QQ(248856300) Copyright 2004-2017 华清远见教育集团 版权所有 ,京ICP备16055225号,京公海网安备110108001117号

    优发娱乐手机版

    百度360搜索搜狗搜索

    优发娱乐手机版

    百度360搜索搜狗搜索