数组
数组是一系列相同类型元素有序的集合。
数组的定义:
一般形式为: 类型符 数组名 [常量表达式] 如 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;
}
{ 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.修改内容
希望大家多多提点一下。