1.数组的创建
1.一维数组
int arr[10];
double data1[20];
char ch[5]; //字符数组
int a =10;
int arr[a]; //这样的写法只能在支持C99标准的机器上(gcc),但是这种数组是不能初始化的
2.二维数组
int arr[10][2]; //先行后列
double data1[20][2];
char ch[5][3];
3.数组的类型
int arr[10];
sizeof(arr) 等价于 sizeof(int [10]) //这里[10]也是整个数组的类型一部分
2.数组的初始化
1.一维数组
int arr[10] = {1,2,3}; //不完全初始化,剩余的元素默认位0;
int arr2[10] = {1,2,3,4,5,6,7,8,9,10};
char ch[10] = {'s','d','g'}; // s d g 0 0 0 0 0 0 0 (3个元素)
char ch2[10] = "abc"; // a b c \n 0 0 0 0 0 0 (4个元素) //要想以字符串打印,最后一位必须是'\n';
2.二维数组
int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int arr[][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; //二维数组的列不能省
int arr[][4] = {{1,2,3,4},{1,2}}; //这样也是可以的
注:对于字符数组初始化,逐个字符赋值(如果赋值的个数等于元素个数,最后不会补充\0)
用字符串常量赋值(当赋值的个数等于元素个数的时候,不能用字符串常量赋值)
0(整数0)和\0(ASCLL值为0)和NULL(宏定义也是0)是一码事
//字符串数组给指针赋值
char str[] = "Hello World";
char * p = str;
char ch1[] = "hello";
char ch2[] = "hello";
char *p = ch1;
char *p = ch2;
p指针保存的地址不一样,ch1和ch2是局部变量,在栈上
注:初始化字符指针是把内存中字符串的首地址赋予指针,并不把该字符串复制到指针。在C编程中,当一个字符指针指向一个字符串常量的时候,不能修改指针指向的对象的值。
字符串给指针赋值
char* p ="Hello World";
*p = 'h'; //错误,字符串常量不能修改。
"Hello World"在常量区,
3.数组数据的读取
1.一维数组
arr[i]读取
2.二维数组
用两层循环进行读取
for(i = 0;i<4;i++)//行循环
{
for(j = 0 ;j <3; j++) //列循环
{
}
}
4.数组在内存这中的存储
一维数组变量的存放是连续的存放在内存空间中(从低地址到高地址)
二维数组变量的存储方式
把二维数组看成一行一维数组(一维数组的数组)
5.数组越界
越界,有时候数组是不会报错的
当是二维数组的时候,越界,也可能在数组范围内
6.数组的使用
int arr = {9,8,7,6,5,4,3,2,1,0};
//冒泡排序(两个相邻元素进行比较,然后交换顺序)
void bubble_sort(int arr[],int index+);
void bubble_sort(int *arr,int index);
{
for(int i = 0 ;i< sizeof(arr)/sizeof(arr[0])-1;i++)
{
//错误示范,坚决不能在函数内部求数组元素个数
for(int j = 0 ;j < sizeof(arr)/sizeof(arr[0])-1 - i;j++)
{
if(arr[j] > arr[j+1])
{
int t = arr[j + 1];
int arr[j+1] = arr[j];
arr[j] = t;
}
}
}
}
7.数组名是是什么?
1.一维数组名确实表示数组首元素的地址但有有两个例外
1.sizeof(数组名);//计算的是整个数组的长度大小,单位是字节
2.&数组名,也表示取出整个数组的地址
printf("%p\n",arr); //数组首元素地址
printf("%p\n",arr+1); //数组第二个元素的地址
printf("%p\n",&arr[0]); //数组首元素地址
printf("%p\n",&arr[0]+1);//数组第二个元素的地址
printf("%p\n",&arr); //数组首元素地址
printf("%p\n",&arr+1); //整个数组地址往后加arr类型字节的地址
2.二维数组的数组名的理解
int arr[3][4];
sizeof(arr) 为 48;
arr;//二维数组的数组名也表示数组首元素的地址
arr+1;//表示二维数组第二行元素的首地址
sizeof(arr)/sizeof(arr[0]); //数组整个长度除以第一行元素的长度得到数组的行数
sizeof(arr[0 ])/sizeof(arr[0][0])数组整行的长度除以第一个元素的长度得到数组的列数