想理解数组,也得对内存有一定理解
内存:储存器
了解几点:
- 编程的本质就是操控数据,而数据存放在内存中
- 为了更好利用内存,我们将内存分成了一个个内存单元
- 每个单元有自己的编号(地址/指针)
数组:一组同类型元素的集合, 也是一块连续的内存空间
int 类型的变量,每个占4个字节,可知:连续存放
1.创建&初始化&使用
- 创建
- type_t (数据类型) arr_name(数组名) [const_n] (元素个数)
- int arr [10];
- 初始化
- int arr [3] = {1,2,3};
- int arr[ ] = {1,2,3};//元素个数可省
- int arr [10] = {1,2,3 (0,0,0,0,0,0,0) };//不完全初始化,剩下的元素默认初始化为0
- 使用
- “ [ ] ” : 下标引用操作符
要注意的:
- 数组的下标从 0 开始
- 下标限制范围: 0 —— n-1(<0 || >n-1 就是越界访问)
2.遍历
用循环的方式将每个元素遍历出来:见上“连续存放”
3.数组作为函数参数
数组名的本质:数组首元素地址(两个例外)
- sizeof(数组名) —— 数组名这时表示整个数组,计算的是整个数组的大小
- &数组名 —— 数组名这时表示整个数组,取出的是整个数组的地址
- 数组作实参时,形式为“arr”;数组做形参时,形式为“arr[ ]”
- 传参时,形参有两种写法:1.数组 2.指针
//指针
//void bubble_sort(int* p_arr,int sz)
//数组
void bubble_sort(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
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[10] = { 9,8,7,6,5,4,3,2,1 };
//如果数组没有给定元素数量,可以如下计算
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;
}
4.字符串&数组
C语言中没法直接定义字符串数据类型,但可以用数组定义
- char str [ ] = “peigen”;
- char str [ ] = {‘p’,‘e’,‘i’,‘g’,‘e’,‘n’,(‘\0’)}
注意:
- 字符串的结束标志是’\0’,所以用第二种方法是要跟’\0’
- printf(“%s”,str);(打印字符串传一个地址过去)
5. \0 的“是非多”
- sizeof(arr) —— 计算数组内所有元素的大小(包括’\0’)
- srelen(arr) —— 计算字符串长度(到’\0’为止,不算’\0’)
6.多维数组
数组在内存中连续存放,我们就能把二维数组甚至n维数组看成一维数组,或者说,二维数组是元素为一维数组的数组,每个元素都是指向一维数组的指针。
- n维数组需要给定后n-1个方括号内的参数,剩下一个编译器可以帮我们计算
- 如int arr [ ] [4] = {1,2,3,4,7,8,9,0} ——2行4列
今天的分享就到这里,不足之处望请斧正
这里是培根的blog,一起进步!