zoukankan      html  css  js  c++  java
  • 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,最后一个自动设置为''

        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;

  • 相关阅读:
    ASP.NET2.0 Provider模型
    平时可以上一上的SQL Server的网站
    有关SQL server connection KeepAlive 的FAQ(1)
    有关SQL server connection Keep Alive 的FAQ(2)
    使用C#的is和as操作符来转型
    BlogEngine学习系列
    复习asp.net form验证
    C#学习之动态化dynamic
    Altium Designer(Protel)网络连接方式Port和Net Label详解
    Altium Designer生成Gerber文件和钻孔文件的一般步骤
  • 原文地址:https://www.cnblogs.com/houzhitong/p/4499824.html
Copyright © 2011-2022 走看看