数组

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

数组的定义:

  一般形式为: 类型符 数组名 [常量表达式] 如 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=%dn",sizeof(a[0])); //数组元素的大小
  printf("a_size=%dn",sizeof(a));    //数组的大小
  printf("a=%pn",a);
  printf("a+1=%pn",a+1);
  printf("&a=%pn",&a);
  printf("&a+1=%pn",&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=%dn",sizeof(a[0])};
  printf("a[0]=%dn",a[0]);
  printf("a[0]+1=%dn",a[0]+1);
  printf("&a[0]=%pn",&a[0]);
  printf("&a[0]+1=%pn",&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.修改内容


 希望大家多多提点一下。

 

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!