数组
数组的创建和初始化
数组是一组相同类型元素的集合
数组的【】中要给一个常量
int arr1[10] = {1,2,3};
int arr2[] = {1,2,3,4};
int arr3[5] = {1,2,3,4,5};
char arr4[3] = {'a',98, 'c'};
char arr5[] = {'a','b','c'};
char arr6[] = "abcdef";
char arr1[] = "abc";
char arr2[3] = {'a','b','c'};
arr1占4个字节,arr2占3个字节
一维数组在内存中的存储
int main()
{
int arr[10] = {0};
int i = 0;
int sz = sizeof(arr)/sizeof(arr[0]);
for(i=0; i<sz; ++i)
{
printf("&arr[%d] = %p\n", i, &arr[i]);
}
return 0; }
仔细观察输出的结果,我们知道,随着数组下标的增长,元素的地址,也在有规律的递增。
由此可以得出结论:数组在内存中是连续存放的。
每次增加4个字节,16进制只是一个地址名字没有意义;实际上1个16进制=0.5个字节;
在地址计算中拿字节算
全局变量不初始化时默认值为0
递归时可以通过改变str+1,来确定新的字符个数strlen(arr+1)
二维数组初始化和创建
int arr2[][5] = { {1,2}, {4,5},{5,6} };
int i = 0;
for (i = 0; i < sizeof(arr2)/sizeof(arr2[0]); i++)//0 1 2
{
int j = 0;
for (j = 0; j < sizeof(arr2[0])/sizeof(arr2[0][0]); j++)
{
printf("%d ", arr2[i][j]);
}
printf("\n");
}
当初始化没有用花括号括起来时默认一个一个放
二维数组在初始化时 行一定要写值;二维数组可以看成多个一维数组组成,一维数组占每一行;三维数组也可以看成多个二维数组(长宽高)
特殊表达方式
二维数组在内存中的存储
int main()
{
int arr[3][4];
int i = 0;
for(i=0; i<3; i++)
{
int j = 0;
for(j=0; j<4; j++)
{
printf("&arr[%d][%d] = %p\n", i, j,&arr[i][j]);
}
}
return 0; }
数组作为函数参数
例题:冒泡排序
void bubble_sort(int* arr, int sz)
{
//趟数
int i = 0;
for (i = 0; i < sz-1; i++)
{
int flag = 1;//假设已经有序
//每一趟冒泡排序过程
int j = 0;
for (j = 0; j < sz-1-i; j++)
{
if (arr[j] > arr[j + 1])
{
flag = 0;
//交换
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
if (1 == flag)
{
break;
}
}
}
int main()
{
//int arr[] = { 3,1,5,2,4,9,8,6,0,7 };
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//写一个冒泡排序的函数,来排序arr数组的内容
//arr-表示的首元素的地址
//&arr[0]
//
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
每走完一趟少一个
数组名是首元素地址,可以通过数组名来访问剩下元素方法是arr+1. 解引用一下
因此在数组作为参数传递过去时,要用指针来存储数组,所以在计算数组元素时要提前在主函数中算好,因为指针的内存只与64位还是32位系统有关,char,int类型指针在32位都是4个字节。
数组名
数组名是首元素地址,除了以下两种情况。
数组名本身就是地址,再加个&就变成整个数组地址
底层:0C+28=34;28十进制换16进制=2*16+8=40; 4十进制换16进制=4;加的是十进制数
外层:arr+1,1是一个整型表示4个字节