IOS笔记-C语言中的指针与数组

1、指针与数组

 

    1)指针与一维数组

 

       i.数组指针(指向数组元素的指针)

 

        类型  *指针变量名;

 

        指针定义完成后要初始化(不想让指向任何内容,=0,=NULL)

        int a[10];

        int *p = &a[0];   // &a[0] == a

        int *p1 = a;

 

       ii.用数组的指针访问数组元素

      

        偏移:指针变量的偏移

 

        p1 = p1+1;    //向下偏移1个一个数组元素

        p1++;   //p1中存放的还是地址

   

        ....

        如果用指针访问第i个元素 p1+i

        取出pi指向的元素的值:*(p1+i);    ==  a[i]元素的值

 

        具体地址值计算:p1+sizeof(数组的类型)

 

 

       指针数组(数组中的每个元素都是指针)

 

         数组中的每一个元素还是一个指针

         int a[3][3]={11,2,3,4,5,6,7,8,9};

          a[0]  //行地址

          a[1]

          a[2]

 

         //pa就是一个指针数组

         int *pa[3]={a[0],a[1],a[2]};

 

   

   2)指针与二维数组

 

       数组指针(指向数组元素的指针)

       特定的格式:

 

        int (*p3)[3]; //定义一个指向二维数组的指针,而且二维数组的第二维长度要是3

    

        int b[3][3];

 

         p3 = b;

 

        int b1[2][3];

 

         p3 = b1;

 

        int b2[2][2];

       

         p3 = b2;  //编译器给警告

 

 

        用指针对二维数组的遍历

 

         int a[3][3] ={1,3,3,2,3,4,5,6,6};

         int (*p1)[3] = a;

 

                   0    1   2

              a[0]+0 a[0]+1 a[0]+2

 

          a[0]     1    3   3

          a[1]     2    3   4

          a[2]     5    6   6

 

            一维数组中: *(p1+0)  = a[0]的值

 

              *(a[0]+1)  

              *(*(p1+0)+1)   == a[0][0] 元素的值

              求a[i][j] = *(*(p1+i)+j)

 

     

       指针数组(数组中的每个元素都是指针)

    

         char *name[3][5]={"aaa","bbbb","cccc"};

 

2、字符数组与字符串指针

 

       char 数组名[10];

 

       c语言中没有字符串变量,字符串都是通过数组来存储的

 

       char a[10]="xxxx";  //数组长度10,字符串的长度5(sizeof),strlen值4

 

       //字符串指针

       char *str ="azaaa";

 

       字符数组和字符串指针的区别

 

       1)字符数组,由数组元素组成,char c[5];c[5]='b'; 存到栈区

       2)字符串指针他只存放了字符串的首地址,存放到常量区

       3)字符串指针来说  

          char *s;

          s = "hello";

 

          char ch[5];

           ch[5]="aa";  //错误的

 

3、补加的输入输出函数

  

    scanf   gets(不安全的)   puts

 

    fgets(指针,n,stdin); //安全的,

         //从键盘接收字符串,放到指针指向的地址,如果字符串长度大于了n,这个时候只接收的字符串长度是:n-1,最后一个自动设置为'\0'

    fputs(指针,stdout);

         //输出现实

 

 

4、const修饰变量和指针

 

    int const *p  //值不能变,指向可变

 

    const int *p  //同上

 

    int * const p;//指向不可变,值可变

 

    const int * const p;  //值和指向都不能变

 

 

5、动态内存分配

 

    内存的分区:

 

    代码区  编译产生的二进制代码

    数据区  程序需要交换的数据

    常量区  常量   字符串常量

    堆区    程序运行的过程中动态申请的内存

    栈区    局部变量存储

 

 

    动态的内存申请:

 

    程序运行的过程中向堆区动态申请一块内存区域

 

    void* malloc(n)  //从内存的堆区中申请n个字节内存

    void* 空指针类型

 

    存储整数

    

    //申请了一个4个字节长度的内存区域,首地址放到了p中

    int *p =(int *)malloc(4);

    char *p1 =(char *)malloc(4);

    float *p2 = (float *)malloc(4);

 

    向内存单元中存储内容:

 

    *p = 10;

posted @ 2015-05-13 11:00  --------  阅读(245)  评论(0编辑  收藏  举报