欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-14 15:12:58
数组 数组是一系列相同类型元素有序的集合。 数组的定义: 一般形式为: 类型符 数组名 [常量表达式] 如 int a[5]; 表示数组有五个元素,a[0]-a[5],不存在元素a[5]。 *注意: 1.常量表达式中可以包含常量和符号常量,如“int a[3+5];" 2.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','\0'};
//这里不要忘记为最后的,'\0'分配空间。如果要初始化一个字符串"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\n",sizeof(a[0])); //数组元素的大小
  printf("a_size=%d\n",sizeof(a));    //数组的大小
  printf("a=%p\n",a);
  printf("a+1=%p\n",a+1);
  printf("&a=%p\n",&a);
  printf("&a+1=%p\n",&a+1);
return 0;

 

 

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

  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\n",sizeof(a[0])};
  printf("a[0]=%d\n",a[0]);
  printf("a[0]+1=%d\n",a[0]+1);
  printf("&a[0]=%p\n",&a[0]);
  printf("&a[0]+1=%p\n",&a[0]+1);

 

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

   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.修改内容


 希望大家多多提点一下。