c语言中一堆数组,c语言中一堆数组
Yyds干货库存
(I)一维数组1的创建和初始化。数组的创建数组是一组相同类型的元素,
创建方法是:type_t arr_name [const_n]
注意:
Type_t是一个数组类型。
Const_n是一个常量表达式,用于指定数组的大小。
示例:
Int arr1[10]是正确的。
int count=10int arr 2[计数]错误
2.数组int arr1[10]={1,2,3}的初始化;没有完全初始化,其余的元素默认初始化为0。
char arr2[5]={a , b , c };是a,b,c,
Char arr2[5]=abc 也可以初始化,是a,b,c,\0,
char arr 4[]= abcdef ;就是a,b,c,d,e,f,\0,一共七个。
注意:
#包含stdio.h
#包含字符串. h
int main()
{
char arr 4[]= abcdef ;
printf(%d\n ,sizeof(arr 4));
printf(%d\n ,strlen(arr 4));
返回0;
}
Sizeof是计算arr4占用的空间。
Strlen正在尝试查找字符串的长度(遇到\0时停止,不计数\ 0;随机大小,不会遇到\0)
strlen和sizeof之间没有联系;
Strlen是求字符串的长度;仅查找字符串的长度;是库函数,引用头文件;
Zeof是计算变量、数组和类型的大小;是一个单位字节;是一个运算符;
#包含stdio.h
#包含字符串. h
int main()
{
char arr 1[]= ABC ;
char arr2[]={a , b , c };
printf(%d\n ,sizeof(arr 1));//4 a,b,c,\0
printf(%d\n ,sizeof(arr 2));//3 a、b、c
printf(%d\n ,strlen(arr 1));//3 a、b、c
printf(%d\n ,strlen(arr 2));//随机数a,b,c.
返回0;
}
“ABC”_ _ _ a,a,c,\0字符数组的末尾有\0
{1,2,3,4}___1,2,3,4整数数组末尾没有\0。
3.一维数组的使用
对于数组的使用,我们之前学过下标引用运算符[]。它实际上是数组访问的操作符。代码如下:
#包含stdio.h
int main()
{
char arr[]= abcdef ;
int I=0;
for(I=0;I=strlen(arr);我)
printf(%c ,arr[I]);//arr数组名[3]下标=这个数字
返回0;
}
虽然此时可以运行,但由于strlen输出默认为无符号数,因此可以优化如下:
(int)strlen(arr)或int len=strlen(arr);伦
摘要
可以使用下标访问数组,下标从0开始;
可以计算数组的大小。
3.一维数组在内存中的存储# includesdio.h
int main()
{
int arr[]={ 1,2,3,4,5,6,7,8,9,10 };
int I=0;
int SZ=sizeof(arr)/sizeof(arr[0]);
for(I=0;i=sz我)
printf(arr[%d]=%p\n ,I,arr[I]);//arr[i]是我被带走时的地址
返回0;
}
每个地址差为4;是元素整形,占4个字节;
所以数组是连续存储的。
(II)二维数组1的创建和初始化。创建二维数组int arr[3][4]意味着三行四列。
int int int int
int int int int
int int int int
#包含stdio.h
int main()
{
int arr[3][4]={ 1,2,3,4,5 };
返回0;
}
我们发现这样写会把1 2 3 4填一行,然后把5填第二行。
那我现在怎么把1 ^ 2 ^ 3放在第一行,把4 ^ 5放在第二行就行了?
那很好。
#包含stdio.h
int main()
{
int arr[3][4]={ {1,2,3},{4,5 } };
返回0;
}
2.二维数组int arr [][4]={1,2,3,4}的初始化即使初始化了,也可以省略行,但是不能省略列。
#包含stdio.h
int main()
{
int arr[3][4]={ {1,2,3},{4,5 } };
int I=0;
for(I=0;i3;我)
{
int j=0;
for(j=0;j 4;j)
{
printf(%d ,arr[I][j]);
}
printf( \ n );
}
返回0;
}
#包含stdio.h
int main()
{
int arr[3][4]={ {1,2,3},{4,5 } };
int I=0;
for(I=0;i3;我)
{
int j=0;
for(j=0;j 4;j)
{
printf( arr[%d][%d]=%p\n ,I,j,arr[I][j]);
}
}
返回0;
}
我们可以看到不同行的地址仍然是连续的。
(3)作为函数参数的数组。编写代码时,数组会作为参数传入函数。例如,我们想实现一个冒泡排序函数来排序一个整数数组。
1.冒泡函数写错效率低。
int bubble_sort(int arr[],int sz)
{
int I=0;
for(I=0;I SZ-1;I )//n个元素需要排序n-1次
{
int j=0;
for(j=0;j SZ-1-I;J )//对每个行程进行排序
{
if (arr[j] arr[j 1])
{
int tmp=arr[j];
arr[j]=arr[j 1];
arr[j 1]=tmp;
}
}
}
}
int main()
{
int arr[]={ 9,8,7,6,5,4,3,2,1,0 };
int I=0;
int SZ=sizeof(arr)/sizeof(arr[0]);
bubble_sort(arr,SZ);//相当于传arr[0]直接改主程序。
for(I=0;我SZ;我)
{
printf(%d ,arr[I]);
}
返回0;
}
我们发现,不管数组是否已经排序,程序都会用完次数;
正确书写
#包含stdio.h
int bubble_sort(int arr[],int sz)
{
int I=0;
for(I=0;I SZ-1;I )//n个元素需要排序n-1次
{
int flag=1;
int j=0;
for(j=0;j SZ-1-I;J )//对每个行程进行排序
{
if (arr[j] arr[j 1])
{
int tmp=arr[j];
arr[j]=arr[j 1];
arr[j 1]=tmp;
flag=0;
}
}
If (flag==1)//优化
打破;//break不用于选择,此时用于循环。
}
}
int main()
{
int arr[]={ 9,8,7,6,5,4,3,2,1,0 };
int I=0;
int SZ=sizeof(arr)/sizeof(arr[0]);
bubble_sort(arr,SZ);//这里arr传输第一个元素的地址。
for(I=0;我SZ;我)
{
printf(%d ,arr[I]);
}
返回0;
}2.数组名# includesdio.h
int main()
{
int arr[10]={ 1,2,3,4,5,6 };
printf(%p\n ,arr);
printf(%p\n ,arr[0]);
printf(%d\n ,* arr);
返回0;
}
结论:数组名是第一个元素地址;
两个例外:
Sizeof(arr)此时计算的整个数组的大小。
虽然arr结果是一样的,但它取的是整个数组的地址。
arr加1后,可以发现arr给整个数组增加了更多的字节。
(4)数组越界。数组下标有范围限制。如果超过这个限制,数组将被越界访问。这个时候编译器可能不会报错,但不代表程序是正确的。
转载请联系作者授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。