• 小白对c语言数组的基础总结


    数组

    数组是一系列相同类型元素有序的集合。

    数组的定义:

      一般形式为: 类型符 数组名 [常量表达式] 如 int a[5]; 表示数组有五个元素,a[0]-a[5],不存在元素a[5]。

      *注意:  1.常量表达式中可以包含常量和符号常量,如“int a[3+5];"

          2.c语言不允许对数组的大小作动态定义。

      //列如,下列对数组的定义是不合法的:
    int n;
    scanf("%d",&n);
    int a[n];
      //这段代码在Visual c++中编译会报错,但在dev c++ 和 gcc中不会,能够正常运行!

      //但是在被调用的函数中定义的数组,其长度可以是变量或非变量表达式 如:
    viod fun(int n)
    {
      int a[n*2];
      
    }

    数组的初始化:

      通过查阅书籍,搜索资料,收集到如下初始化方式:

    int a[5]={0,1,2,3,4};   
     // a[0]=0, a[1]=1, a[2]=2, a[3]=3, a[4]=4
    char ch[]

    int a[5]={0,1};  //只对一部分元素赋值
    // a[0]=0, a[1]=1, a[2]=0 a[3]=0 a[4]=0

    int a[5]={0};    //全部元素赋值为0;
    // a[0]=0, a[1]=0 a[2]=0 a[3]=0 a[4]=0

    int a[]={0.1.2.3.4}  //知道元素个数,不指定数组长度
    // a[0]=0, a[1]=1, a[2]=2, a[3]=3, a[4]=4

    char ch[5]={"hello"};
    char ch[5]="hello";

    char ch[10]={'h','e','l','l',''};
    //这里不要忘记为最后的,''分配空间。如果要初始化一个字符串"hello",那为它定义的数组至少有6个数组元素,但是如果忘记了,一些编译器会自动补充

    int a[5];
    for(i=0;i<5;i++)
    {
     a[i]=i;
    }//使用for循环赋值

    //使用memset给数组赋指定的ASCLL值
      char a[10];
      memset(a,0,strlen(a)); //全部赋值为0
    用法:void *memset(void *s, int ch, int size_t n)

    数组的大小和长度:

      sizeof(数据类型)*元素个数

      sizeof(数组名)

    int a[5];
    sizeof(a); //此时a代表的是数组名,而不是数组的首地址 所以大小为20,而不是4;

      malloc函数动态分配数组长度

    int main()
    int len; 
        printf("输入分配的数组长度:len= "); 
        scanf("%d,&len"); 
        int * pArr = (int *)malloc(sizeof(int)*len); 
        *pArr = 4;          //类似于a[0] = 4; 
        pArr[1] = 10;     //类似于a[1] = 10,指针的数组用法
        *(pArr+2)=20;    //通过+1操作赋值
       printf("%d %d %d", *pArr, pArr[1],*(pArr+2)); 
     
        free(pArr);  
     
        return 0
    }

       len=5时,便使用malloc函数分配20个字节,并强制转换成int类型的地址,malloc函数只返回第一个字节地址,通过+1操作获取后面的地址。

       使用free(pArr)释放内存。

     
    数组的地址:
        1.a与&a

        虽然a=&a,在值上看起来相等,也都表示数组的首地址,我们通过+1操作来了解它们的区别。

    int a[10]={0,1,2,3,4,5,6,7,8,9};
      printf("a[0]_size=%d
    ",sizeof(a[0])); //数组元素的大小
      printf("a_size=%d
    ",sizeof(a));    //数组的大小
      printf("a=%p
    ",a);
      printf("a+1=%p
    ",a+1);
      printf("&a=%p
    ",&a);
      printf("&a+1=%p
    ",&a+1);
    return 0;

      

      a:它的类型是int* 所以它+1的步长为数组元素大小的字节数,也就是4个字节,a+1就是a[1]的地址。

      &a:它的类型数int *[10] 所以它+1的步长为数组大小的字节数,也就是40个字节,&a+1就是a[10]的地址(a[10]已经越界了)。

      2.a[0]与&a[0]

      int a[10]={0,1,2,3,4,5,6,7,8,9};
      printf("a[0]_sizeof=%d
    ",sizeof(a[0])};
      printf("a[0]=%d
    ",a[0]);
      printf("a[0]+1=%d
    ",a[0]+1);
      printf("&a[0]=%p
    ",&a[0]);
      printf("&a[0]+1=%p
    ",&a[0]+1);

      

       a[0]:数组中的元素,值为0,a[0]+1=1。

      &a[0]:数组首元素的地址,其值与a和&a相同,它的类型为int *,所以它+1的步长为数组元素大小的字节数,也就是4个字节,&a[0]+1就是a[1]的地址。


    数组的使用方式

      1.数组形式

      2.指针形式

    int a[5];
    a[0]=0;  //数组形式
    *(a+1)=1; //指针形式

    修改数组内容的汇编过程:

      1.通过数组名找到首地址;

      2.根据地址的偏移量,找到需要修改元素的地址

      3.修改内容


     希望大家多多提点一下。

     

  • 相关阅读:
    JVM
    SpringDataES
    Lucene
    linux下如何实现mysql数据库每天自动备份定时备份
    java的finalize()函数
    Java代码优化(长期更新)
    HashMap实现原理及源码分析
    Java中的equals和hashCode方法详解
    java中JVM的原理
    Java程序员应该了解的10个设计原则
  • 原文地址:https://www.cnblogs.com/kxsph/p/8597838.html
Copyright © 2020-2023  润新知