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

Posted 洋葱洋葱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针与一维数组和二维数组以及字符串指针数组的学习笔记相关的知识,希望对你有一定的参考价值。

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

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

请自行加入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\\t", *(buf+i));
  }
  printf("\\n");
}

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

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.\\n", buf[1]);

  printf("sizeof(buf[1]) = %d.\\n", sizeof(buf[1]));
  printf("buf[1] = 0x%x.\\n", buf[1]);
  printf("sizeof(buf) = %d.\\n", 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;
}

 运行结果:

 

以上是关于指针与一维数组和二维数组以及字符串指针数组的学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

史上最强C语言教程----指针(笔试题1)

C语言指针指向一维数组与二维数组?

c语言学习--数组

详解C语言指针

深入理解C指针经典笔试题——指针和数组

C-二维数组, 字符串, 指针