一维数组和一级指针浅析

Posted SmartGame

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一维数组和一级指针浅析相关的知识,希望对你有一定的参考价值。

  想要了更容易的了解指针,很好的用法就是通过数组来了解,在c里面,感觉一维数组和一级指针的用法差不多,二维数组和二级指针的用差不多,所以通过数组来了解指针是一种很好的方法;

  数组:将相同 数据类型 的元素按一定顺序排列的集合,把有限个类型相同的 变量 用一个名字命名,然后用编号区分他们的变量的集合,这个名字成为数组

  其实我们可以把数组看成是一个字符串,就像是C++中的string字符串类型的变量一样,因为c中没有关于字符串变量的定义,我们可以把数组看成是一个字符串吧!

  数组和字符类型是不一样的;

  {

    char a;

    char b[64];

    a = ‘a‘;

    strcpy(b,"aaa");

  }

  就像上面这样字符类型在空间中只分配有一个字节,而数组可以自定义的分配空间,数组写入数据的时候也不像字符类型那样可以直接写入,可以通过键盘输入,要么就是像上面那样;当然还有memcpy(),strncpy()等,这里就不一一举例了;

  然后上面这段代码要是这样写:

  

  {

    char a;

    char b[64];

    a = ‘a‘;

    strcpy(b,"aaa");

    printf("%c\n",a);// 输出 a 

    printf("%d\n",a);//输出 a 在ASCLL中的序号97

    printf("%d\n",&a);// 输出a的地址不同电脑可能不一样

    printf("%d\n",&b);//输出地址7863796

    printf("%d\n",b);///输出7863796

    printf("%d\n",&b[0]);//输出地址7863796

    system ("pause");

  }

  我们发现输出&b,b,&b[0] 竟然都是b的地址,那么我们可不可以吧b看成是指向b首地址&b[0]的指针呢?

  {

    char b[64];

    char *c = NULL;

    c = b;// 将一维数组的地址传递给指针

    //或者 c = &b;

    printf("%d\n",b);

    printf("%d\n",c);

  }

  我们发现打印出来的结果是一样的,那么关于用法上我们也可以看看,其实这一点在数组作参数的退化问题哪里我已经写过了;

  {

     char a[64] = "aaaa";//直接往空间赋值了

    char *b = NULL;

    int i = 0;

    int j = 0;

    i = strlen(a);//计算字符串的个数

    b = a;//将地址传递给b

    //下面打印字符串,一个一个的通过下标打印

    for(j = 0 ; j < i : i++)

    {

      printf("%c ",a[i]);

     }

    putchar(‘\n‘);//换行

    

   for(j = 0 ; j < i : i++)

    {

      printf("%c ",b[i]);

    }

    //或者

    

    for(j = 0 ; j < i : i++)

    {

      printf("%c ",*(b +j));

    }

  }

  我们发现printf("%c ",a[i]);,printf("%c ",b[i]);,printf("%c ",*(b +j));三种输出都可以将字符打印出来,效果完全一样,所以我们可以将一级指针看成是一维数组,一维数组看成指针;但是记住这里是看成,不能理解为是等价的;比如一级指针取地址可以传递给二级指针但是数组就不能。所以说如果用的话,我们可以把指针当成数组使用。

  

以上是关于一维数组和一级指针浅析的主要内容,如果未能解决你的问题,请参考以下文章

数组和指针,内存之间的关系

详解C语言指针

你比昨天更懂指针了吗?

C语言篇+ 指针进阶(上)

C语言中怎样区分一维指针和二维指针?

4-指针和数组