一维数组的创建和初始化
数组是一组相同类型元素的集合。数组的创建方式
type_t arr_name [const_n]分别对应着
数组类型 数组名 数组的元素大小(指定常量表达式)
数组的创建例子,创建一个整型数组
#define _
#include<stdio.h>
int main()
{
int arr[10];//一个int类型的 叫arr的包含10个元素大小的数组
return 0;//这就是数组的创建
}
一维数组的初始化
数组的初始化是指,在创建数组的同时给数组的内容一些合理初始化值
#define _
#include<stdio.h>
int main()
{
int arr[10] = {1,2,3};//不完全初始化,剩下的元素默认初始化为0
char arr2[5] = {'a', 'b'};//字符类型的不完全初始化,剩下的元素也默认初始化为零
char arr3[5] = "ab";//这样也可以初始化,元素分别为a,b,/0剩下的都是0
char arr4[] = "abfdef"
return 0;
}
sizeof与strlen
int main()
{
int arr4[] = "adcdef"
printf("%d\n", sizeof(arr4));//7,计算空间大小,/0也占
printf("%d\n", strlen(arr4));6 ,计算字符串长度,/0不算
return 0;
}
sizeof 计算变量,变量,数组,类型所占空间的大小,单位是字节
sizeof,是操作符
strlen 求字符串长度 只能针对字符串 ,遇到/0就停止,他是库函数
int main()
{
int arr1[] = "abc";//这种初始化方式算是放了四个元素
int arr2[] ={'a', 'b', 'c'};//而初始化是这种方式算是放了三个元素
printf("%d\n", sizeof(arr1));//这里的答案是4
printf("%d\n", sizeof(arr2));//sizeof只关心大小所以这里答案就是3
printf("%d\n", strlen(arr1));//这里答案就是3
printf("%d\n", strlen(arr2));//这里的答案就是随机值,arr2的初始化方式不包括/0
return 0;
}
一维数组的使用
对于数组的使用有一个操作符:[] 下标引用操作符,用来访问数组元素的操作符
int main()
{
char arr[] = "abcdef";//对于我们的元素,每个元素都有对应的下标,从0开始递增1
//比如我们要求一个元素‘d’的元素
printf("%c\n", arr[3]);//这样就可以打印出
return 0
}
如果我们要全部打印字符,则可以利用for循环全部打印
#define _
#include<stdio.h>
int main()
{
char i = 0;//首先创建一个变量//int len = strlen(arr);
//for(i=0; i<len; i++)也可以这么写
//
for(i=0; i<6; i++)//从0开始打印到下表为5的元素停止,当然也可以这样for(i=0; i<(int)strlen(arr); i++))
{
printf("%c ", arr[i]);//abcdef
}
return 0;
}
如果要打印全部字符数组
#define _
#include<stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,};
int sz = sizeof(arr)/sizeof(arr[0]);//要全部打印首先得真知道元素个数
int i = 0;//
for(i=0; i<sz; i++)//
{
printf("%d ", arr[i]);
}
return 0;
}
一维数组在内存中的存储
一维数组在内存中是连续存放的
二维数组的创建和初始化
int main()
{
int arr[3][4];//代表创建了3行和4列,二维数组以几行几列的形式写
return 0;
}
二维数组的初始化
int main()
{
int arr[3][4] = {1,2,3,4,5};//也是不完全初始化,5会出现到第二行的数组里,第二行的分别就是5,0,0,0
//代表创建了3行和4列,二维数组以几行几列的形式写//二维数组的不完全初始化,剩下元素也是为0
//如果我要把1,2,3放在第一行,4,5放在第二行,我就要用代码块把他括起来例如
int arr[3][4] = {{1,2,3},{4,5}};//这样第一行分别就放这1,2,3,0第二行放4,5,0,0
return 0;
}
在二维数组中可以省略行但是不能省略列
二维数组的使用
二维数组的使用也是通过下标的方式来使用
假如我要访问二维数组里的某个元素,则我就要锁定他的行和列,行和列的下标分别也是从0开始
#include<stdio.h>
int main()
{
int arr[][] = {{1,2,3},{4,5}};
int i = 0
for(i=0; i<3, i++)//首先for循环行,确定行
{
int j = 0;
for(j=0; j<4; j++)//然后在行内部确定列
{
printf("%d\n",arr[i][j]);//打印行列,这时候就会打印出(1,2,3,0)(4,5,0,0)(0,0,0,0)
}
}
return 0;
}
二维数组在内存中的存储
二维数组在内存中的存储也是连续存放的,如果知道了首元素的地址就能找到个各个元素的地址
可以想象为二维数组是由一维数组组成的
#define _
#include<stdio.h>
int main()
{
int arr[i][j] = {{1,2,3},{4,5}};
int i = 0;
for(i=0; i<3; i++)
{
int j = 0;
for(j=0; j<4; j++)
{
printf("&arr[%d][%d] = %p\n", &arr[i][j]);
}//打印二维元素的各个地址
}
return 0;
}
数组作为函数参数
往往我们写代码的时候,会将数组作为参数传个函数,比如:我要实现一个冒泡排序,函数将一个整型数组排序。
#define _
#include<stdio.h>
void bubble_sort(int arr[], int sz)//arr是首元素的地址
{
//确定冒泡排序的趟数 每趟就是n,多趟就是n-1 ,所以就是元素个数减一,sz-1
int i = 0;
for(i=0; i<sz - 1; i++)
{
//每一趟冒泡排序
int j = 0;
for(j=0; j<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};
//将arr进行排序,排成升序
int i = 0;
int sz = sizeof(arr)/sizeof(arr[0]);//10//在这里算元素的个数然后在传参
//arr是数组 ,我们对数组进行传参,实际上是传递过去的是首元素arr[]的地址
bubble_sort(arr,sz);//冒泡排序函数
for(i=0; i<sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
数组名是什么
数组名就是我们的首元素地址(有两个除外)sizeof()和&(数组名)
#define _
#include<stdio.h>
int main()
{
int arr[] = {1,2,3,};
printf("%p\n", arr);//这里则会打印首元素的地址
printf("%p\n", &arr[0]);//这里也会打印首元素的地址,与第一种方式是等价的
printf("%d\n", *arr);//把arr解引用,结果就是1,就能证明数组就是首元素的地址
return 0;
}
1.sizeof内部单独放数组名,他计算的就是整个数组的大小,表示整个数组,单位是字节
2.&(数组名)的时候,数组名代表整个数组,&数组名,取出的是整个数组名的地址,虽然与arr,&arr[0],取出的地址相同,但是,&(数组名),代表的是数组的地址,只是从1的首元素地址开始,但他代表着整个数组的地址,整个数组是从1的地址开始
下标为0的元素叫做首元素