• iOS开发——C篇&数组与指针


     

    2015-07-17 13:23 编辑

     

    前面我们介绍了关于C语言的内存分配问题,下面我们就开始介绍关于C语言的两个非常重要的知识点:数组与指针

     

    数组与指针其实不仅仅是再C语言中,再OC中(当然OC是内部已经帮我们处理好了,但是还有存在大量的指针),C#中,C++中等待一些开发中都是非常常见的,所以作为一个程序员是必须掌握的。

     

       一、数组:相同类型的集合

    1:一维数组

    平时我们都是申明一个变量,那么如果变量很多我们要怎么做呢,这个时候我们就能用到数组,那么什么是数组呢?

    首先来看一个实例:

    #include<stdio.h>

     

    int main(void)

    {

      int a [20];

      这里我们称a为为20个元素的数组;每个元素都是你听类型,当然你也可以申明成其他类型(注意哦:这里是一次性申明的)

      其中[]里面的数字表示下表:a[0]。。。。a[19]

      return 0;

    }


            数组就是数据的整合。

        比如整型数组的定义的格式如下:

            int 变量名[元素个数];

            例:int a[10]; 接着就是数据是怎么存放到整型数组中的,数组的存放有一下几种方式:

    •            在定义的时候赋值      int a[5]={0,1,2,3}   
    •            在定义时时候对单赋值      int b[9]={[4]=5,[7]=2};
    •            在定义时时候不赋值         int c[6];   a[2]=1; a[3]=4;

               既然数据可以存放多个数据,它在内存中是这么存放的:

    注:数组不能整理赋值:如a = b;
      
    下面给大家看一个实例:

       int main()
    {
        char cs[5]={'1','2','3','4','5'};

        return 0;
    }

     

           注:内存给数组分配也是从大到小根据占据字节分配,依次的从上到下存放数据,并且cs的地址就是它的首地址即cs[0],和存储变量的方式很雷同,只不过没有转换成二进制。

     

    2:二维数组

      其实:在存储数据如果使用数组,难免有些不足,那么就有了二维数组,二维数是数组的数组,或者把它看成两个一维数组。

            二维数组可以存放的数据比一维数组要多的多,实际上就是两个一维数,数组的输入和输出方式可以用for循环来实现:

     

     

     

    3:数组中的sizeof和strlen介绍

             sizeof:求所占字节数需要算上''

       strlen:是单纯求字符串的长度,需要加头文件string.h

           

    下面看一个实例:

    看下面代码

    int i,a[]={3,4,5,6,7,3,7,4,4,6};
    for (i=0;i<=9;i++)
    {
      printf ( “%d”, a[i] );
    }

    很显然,它是显示a 数组的各元素值。

    我们还可以这样访问元素,如下

    int i,a[]={3,4,5,6,7,3,7,4,4,6};
    for (i=0;i<=9;i++)
    {
      printf ( “%d”,  *(a+i) );
    }

    它的结果和作用完全一样

     

    二、指针:(是一个变量)

    指针是一个8字节的变量,

    #include<stdio.h>

    int main(void)

    {

    int a;

    int *p = &a;//取地址符,把吖的地址放到p里面!

     printf("%ld ", sizeof(o),sizeof(int *));

    return 0;

    }

       C语言的核心就是指针,指针可以操作内存,间接性的修改内存里的数据。

      指针类型:

    1.     有数组指针,
    2.     字符指针,
    3.     字符串指针,
    4.     指针的指针,
    5.     函数的指 针,
    6.     结构体的指针
    7.     。。。

    1. 数组指针,顾名思义就是定义一个指针,指针里存放的值就是数组的地址。

     

    }

     

      
          2.字符指针就是单个字符的指针,比较关注的还是字符串指针,也就是字符数组指针,但是在定义时完全可以用指针去代替,例如:

      
      char *name="minglei";    //字符串常量

      一般的定义是:

      char name[10];           //字符串变量

      char *n=name;

     

    我们定义一个指针指向指针的指针;

    •                        int a=5;         变量a的数据类型为int
    •    
    •                        int *p=a;        指针p的数据类型为int *
    •   
    •                        int **pp=p;      指针pp的数据类型为int **

           只要记住(数据类型 *)是一体的就很容易理解了。

           3. 数组名与指针变量的区别

    请看下面的代码:

    int i,*pa,a[]={3,4,5,6,7,3,7,4,4,6};
      pa =a;
      for (i=0;i<=9;i++)
      {
        printf ( “%d”, *pa );
        pa++ ;  //注意这里,指针值被修改
      } 

    可 以看出,这段代码也是将数组各元素值输出。不过,你把{}中的pa改成a试试。你会发现程序编译 出错,不能成功。看来指针和数组名还是不同的。其实上面的指针是指针变量,而数组名只是一个指针 常量。这个代码与上面的代码不同的是,指针pa在整个循环中,其值是不断递增的,即指针值被修改了 。数组名是指针常量,其值是不能修改的,因此不能类似这样操作:a++.前面4,5节中pa[i],*(pa+i )处,指针pa的值是使终没有改变。所以变量指针pa与数组名a可以互换。

    注:指针还可以进行加减运算

    将数组与指针结合使用:

    指针数组
      一个指针数组是指一个数组中的每个元素都是一个指针,例如:

    int *p[10];//而不能是int (*p)[10]

    或者

    char *p[10];

    此时p是一个指针(数值上和&p[0]一样);
    在前面有int t[10];

    int * pt=t;//使用pt指向t

    那么这里我们用什么指向int *t[10]中的t呢?我们要使用一个指针的指针:

    int **pt=t;

      这是因为:在int *t[10]中,每个元素是指针,那么同时t又指向这个数组,数组上和&t[0]相同,也就是指向t[0],指向一个指针变量,可以说是一个指针的指针了,所以自然要用

    int **pt;

     同样这里我以一个图弄清楚数组与指针:

    如果你能看懂这个(结果是什么?),那么你就把数组与指针基本上入门了,记住知识入门哦!

  • 相关阅读:
    js 仿 asp中的 asc 和 chr 函数的代码
    escape,encodeURI,encodeURIComponent
    从项目从SVN上check下来,用idea打开后,idea没有SVN的工具栏解决方法
    idea中导入SVN的项目时,连接失败,报“Cannot run program "svn"
    spring基础----事件(Applicaition Event)
    idea在导入项目时遇到的问题
    Spring基础---bean的初始化和销毁
    spring基础----EL和资源调用
    spring基础----Bean的Scope
    面试题-------------js三种信息框
  • 原文地址:https://www.cnblogs.com/Alex-Phoenix/p/4654204.html
Copyright © 2020-2023  润新知