• 指针与一维数组和二维数组以及字符串指针数组的学习笔记


    废话不多少,直接上代码,关键的东西已经注释了,看注释信息理解即可。

    说明:本程序讨论了一维数组和指针的关系,谈论了二维数组和指针之间的关系,讨论了字符串数组指针数组和指针之间的关系,代码中以给出定义的方法和简单的使用,但是有些使用方法并没有列出,如果需要,

    请自行加入printf调试即可。

    转贴请注明出处,欢迎和我讨论,谢谢。

                   ----------cofin_add

    #include <stdio.h>

    void fun(int m, char *((*p)[m]))
    {
      int i = 0;
      char ** buf = (char **)p;
      for(i=0;i<m;i++)
      {
        printf("%s ", *(buf+i));
      }
      printf(" ");
    }

    void fun1(int m, char **buf)
    {
      int i = 0;
      for(i=0;i<m;i++)
      {
        printf("%s ", *(buf+i));
      }
      printf(" ");
    }

    int main(void)
    {
      char *buf[] = {"aa", "bb", "cc", "dd", "ee", "ff"}; //指针数组,其中的每一个变量(指针),指向第一个字符串的首地址。
      char **pa = buf; //如何指向数组中的元素呢,因为其中的每一个元素都是指针,所以应该用二重指针指向它。
      char **px = &buf[0]; //数组名就是数组元素的首地址,可以看到和上面是一样的。
      char *(*pb)[6] = &buf; //如何指向指针数组本身?因为数组其中共有六个变量(有6个指针或者指针变量(地址)),故应该用数组指针来指向它,
      //但是由于其中的变量是指针,所以应该在加一个*,纯属个人猜测,如果这个成立的话,也可以解释上面的为什么是用二重指针了,因为buf和&buf[0]等价
      //也就是说,其实&buf[0] 是地址的地址(因为buf[0]本身存储的就是地址),应该用二重指针指向。

      //一维数组再研究
      int a[5] = {0}; //定义数组,有5个int型的变量
      int *p1 = a; //定义指针指向数组中的元素
      int (*p2)[5] = &a; //若是要指向这个数组本身,则需要用数组指针指向它,注意要加括号,[]比*优先级高。

      //二维数组的指针研究
      int aa[2][5] = {0};
      int (*p3)[5] = aa; //指向二维数组中的元素,二维数组中的元素就是一维数组,参考指向一维数组的方法即可
      int (*p4)[5] = &aa[0]; //和上面一样,数组的名字就是数组的首元素的地址,其实是一个地址,也就是一维数组的数组地址。
      int *p5 = &aa[0][0]; //指向二维数组首元素(一维)的首地址,用int *p,类型刚好匹配
      int (*p6)[2][5] = &aa; //指向二维数组本身的指针。总结:把定义中的数组名字换成指针,加()即可。

      char *p = buf[1]; //buf[0] => 里面存的指针数组中的是第一个元素的地址,也就是直接把一个地址给他初始化

      printf("buf[1] = 0x%x. ", buf[1]);

      printf("sizeof(buf[1]) = %d. ", sizeof(buf[1]));
      printf("buf[1] = 0x%x. ", buf[1]);
      printf("sizeof(buf) = %d. ", sizeof(buf));

      fun(sizeof(buf)/sizeof(buf[0]), &buf); //这里传的是数组指针的地址,类型推倒:原来是一个指针数组,char *pt[x],如果是
      //普通数组的话,char a[x],若指向该数组本身则应该写作 char (*p)[x] = &a; 根据这一点,类比到指针数组也就是 :char *(*p)[x] = &pt;

      fun1(sizeof(buf)/sizeof(buf[0]), buf); //同理
      return 0;
    }

     运行结果:

  • 相关阅读:
    Codeforces 1355 D. Game With Array
    Codeforces 1355 C. Count Triangles
    Codeforces Round #641 (Div. 2)
    Codeforces 1345 D
    hdu6787(骰子+往回推的传输带问通过方案,dp)
    hdu6745(渐减1过程的最多互质对数,dp)
    D Points Construction Problem(思维构造,等周定理)
    Codeforces Round #658 (Div. 2)D(01背包)
    Codeforces Round #655 (Div. 2)E(矩阵范围dp)
    hdu4622([u,v]内有多少个子串)
  • 原文地址:https://www.cnblogs.com/cofin/p/6837054.html
Copyright © 2020-2023  润新知