数组
数组一组相同类型元素的集合。
数组类型 arr[常量表达式]; c99语法支持 变长数组 - 数组的大小是变量
数组初始化
int arr[5] = { 1,2,3,4,5 };// 完全初始化 1 2 3 4 5
int arr1[5] = { 1,2,3 };// 不完全初始化 1 2 3 0 0
int arr2[] = {1,2,3,4,5};// 不确定常量 会根据后面初始化内容多少个,来决定多少个元素
// ------------------------------------------------------------------------------
char ch1[5] = {'a','b','c','d'};
char ch1[] = {'a','b','c','d'};
数组的下标从零开始
字符串对应当前 ASCII 的字符串
结尾是 '\0'
char ch[5] = "bit";// 'b' 'i' 't' '0' '0'
char ch1[] = "bit";// 'b' 'i' 't'
char ch1[] = "bit";
// [ 'b','i','t','\0']
char ch2[] = { 'b','i','t' };// bit烫烫烫烫烫烫烫
// ['b','i','t']
// 打印到后面不知道是什么 没有遇到 \0 不会停直到在内存中找到 \0
// 这样它们求 字符串长度也大不相同。
printf("%d \n", strlen(ch1)); // 3 正确的字符串长度
printf("%d \n", strlen(ch2)); // 42 随机值
int main()
{
int arr[10] = { 0 };
arr[4] = 5;// [] 下标引用符
int sz = sizeof(arr) / sizeof(arr[0]);
for (int i = 0;i < sz;i++)
{
// 0 0 0 0 5 0 0 0 0 0
printf("%d \n", arr[i]);
}
return 0;
};
一维数组
int main()
{ // %p 按地址的格式打印 16进制打印
int arr[10] = { 0 };
for (int i = 0;i < 10;i++)
{
printf("&arr[%d] = %p \n",i, &arr[i]);
}
return 0;
};
- 一维数组在内存中是连续存放的
- 随着数组下标的增长,地址是由低到高变化的
- 数组名是数组首元素的地址
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = arr;// 取到首个
for (int i = 0;i < 10;i++)
{
printf("%d ", *p);
// 1 2 3 4 5 6 7 8 9 10
// 证明数组是连续的
p++;
}
return 0;
};
二维数组
二维数组的创建与初始化
int main()
{
int arr[3][4];// 创建 三行四列的二维数组
return 0;
};
// ------------------------------------------------------------
int main()
{
// 初始化 不完全初始化 int类型补 0 ,char 后面补 \0
int arr1[3][4] = { 1,2,3,4,5,6 };
// 完全初始化
int arr2[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
// 一行一行指定初始化
// {}每个括号为一行 元素不够补 0
int arr3[3][4] = { {1,2,3},{4,5,6},{7,8,9} };
// 二维完全初始化
int arr4[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };
// 行省略 列不可以
int arr5[][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };
return 0;
};
// ------------------------------------------------------------
// 二维数组打印
int main()
{
int arr[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };
for (int i = 0;i < 3 ;i++)
{
for (int j = 0;j < 4;j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
};
// ------------------------------------------------------------
int main()
{
int arr[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };
for (int i = 0;i < 3 ;i++)
{
for (int j = 0;j < 4;j++)
{
printf("&arr[%d][%d] = %p \n",i,j, &arr[i][j]);
}
printf("\n");
}
return 0;
};
-
二维数组在内存中也是连续存在的
-
一行内部连续,跨行也是连续
int main()
{
int arr[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };
int* p = &arr[0][0];// 拿出第一个
for (int i = 0;i < 12 ;i++)
{
printf("%d ", *p);// 连续打印
p++;// 每次向后走一位
}
return 0;
};
void bob_sort(int n[],int sz)
{
for (int i = 0;i < sz -1; i++)
{
for (int j = 0; j < sz - 1 -i; j++)
{
if (n[j] > n[j + 1])
{
int tp = n[j];
n[j] = n[j + 1];
n[j + 1] = tp;
}
}
}
}
int main()
{
int arr[] = { 9 ,8,7,6,5,4,3,2,1,0};
// 冒泡排序
// 两两相邻的元素比较,并且可能的话需要交换
int sz = sizeof(arr) / sizeof(arr[0]);
bob_sort(arr, sz);
return 0;
};
数组名是什么?
- 数组名是首元素地址
- 有两个意外。
- sizeof(数组名)数组表示整个数组,计算的是整个数组的大小单位是 byte。
- &数组名 数组名表示整个数组 取出的是整个数组的地址。
int main()
{
int arr[] = { 9 ,8,7,6,5,4,3,2,1,0};
printf("%p \n", &arr[0]);// 首元素
printf("%p \n", arr);// 数组
printf("%p \n", &arr);// 数组地址
return 0;
};