文章目录
一、一维数组的创建和初始化
1.数组创建, [ ] 中要给一个常量才可以,不能使用变量。
`2.数组的初始化是指:在创建数组的同时给数组的内容一些合理初始化值(初始化)。
3.数组在创建的时候如果不指定数组的确定的大小就得初始化。数组的元素个数根据初始化的内容来确定。
#include <stdio.h>
int main()
{
char ch5[] = { 'a','b','c' }; //输出结果: bit烫烫唐it。由于没有结束字符'\0',所以都是随机值,直到遇到结束符'\0',printf才可打印结束
char ch6[] = "abc";//必须要初始化。
printf("%s\n", ch5);
printf("%s\n", ch6);
return 0;
}
二、一维数组的使用
[ ] ,下标引用操作符。它其实就是数组访问的操作符。
int arr[10] = { 0 }; //数组的不完全初始化,数组一定要初始化。
int sz = sizeof(arr)/sizeof(arr[0]); //多算一个结束标志 '\0'
三、一维数组在内存中的存储
%p:按地址的格式打印,16进制打印
仔细观察输出的结果,我们知道,随着数组下标的增长,元素的地址,也在有规律的递增。由此可以得出结论:数组在内存中是连续存放的
。
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
int i = 0;
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i)
{
printf("&arr[%d] = %p\n", i, &arr[i]);
}
return 0;
}
每一个整型是4个字节。
#include <stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = arr;
int i = 0;
for (i = 0; i < 10; i++)
{
printf("arr[%d]=%d\n", i, *p);
p++; //指针
}
return 0;
}
四、二c维数组的创建和初始化
行 可以省,列 不可以省
int arr[3][4] = { 1,2,3,4 };
int ar[3][4] = { {1,2},{3,4} };
int arr[][4] = { {2,3} ,{4,5} }; //行 可以省,列 不可以省 !!!
五 、二维数组的使用
二维数组 在内存中也是连续存储的。
#include <stdio.h>
int main()
{
int arr[3][4];
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 3; j++)
{
printf("&arr[%d][%d]=%p\n", i, j, &arr[i][j]);
}
}
return 0;
}
每一个整型都是 4 字节。
#include<stdio.h>
int main()
{
int arr[][4] = { {1,2} ,{3,4}, {5,6} };
int i = 0;
int j = 0;
int* p = &arr[0][0];
for (i = 0; i < 12; i++)
{
printf("%d\n", *p);
p++;
}
return 0;
}
六、二维数组在内存中的存储
由上可知:
二维数组 在内存中是连续存储的。
七、数组作为函数参数
数组名 是数组首元素的地址 -----------(只有在例外1、例外2中,数组名不是数组首元素的地址,而是表示整个数组。)
例外1:sizeof(数组名),计算整个数组的大小,sizeof 内部单独放一个数组名,数组名表示整个数组。
例外2:&数组名
,取出的是数组的地址
。&数组名,数组名表示整个数组。
#include <stdio.h>
int main()
{
int arr[5] = { 0 }; //虽然结果相同,但是只有 1 是数组的地址,2、3 是数组首元素的地址!!!
printf("1、%p\n", &arr); //数组的地址
printf("2、%p\n", &arr[0]); //数组首元素的地址
printf("%3、p\n", arr); //数组首元素的地址
return 0;
}
printf(“%d\n”, sizeof(arr)); //结果:40
printf(“%d\n”, sizeof(int[10])); //结果:40
原因:int [10] 是 arr数组的类型
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
printf("%d\n", sizeof(arr)); //结果:40
printf("%d\n", sizeof(int[10])); //结果:40
//原因:int [10] 是 arr数组的类型
return 0;
}
八、冒泡排序函数
方法 1 :
#include <stdio.h>
int main()
{
int arr[9] = { 1,2,3,4,5,6,7,8,9 };
int i = 0;
for (i = 0; i < 8; i++) //趟数
{
int j = 0;
for (j = 0; j < 8 - i; j++) //挨个的比较次数
{
int tmp = 0;
if (arr[j] < arr[j + 1])
{
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
for (i = 0; i < 9; i++)
{
printf("%5d", arr[i]);
}
return 0;
}
方法 2 :
flag 的使用:
当数组本身满足要求时,可以不进行比较。
#include <stdio.h>
int flag = 0; //全局变量 flag,当 flag 始终是 0 时,说明原数组本身就符合要求
int cmp(int arr[], int sz) //int arr[] 是一个指针:int *arr
{
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 = 0;
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 1; //只要有数值有变化,flag 就会被改变
}
}
}
}
int main()
{
int arr[9] = { 1,2,3,4,5,6,7,8,9 };
int sz = sizeof(arr) / sizeof(arr[0]);
cmp(arr, sz);
if (0 == flag) //flag 的妙用!!!
{
printf("这个数组本身就是从大到小排列的\n");
}
for (int i = 0; i < sz; i++)
{
printf("%5d", arr[i]);
}
return 0;
return 0;
}
方法 3 :对方法2的进一步改进
知识点:
break: 直接结束for后面所有的循环
#include <stdio.h>
int cmp(int arr[], int sz) //比较大小
{
int flag = 1; //当 flag 始终是 1 时,说明原数组本身就符合要求
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 = 0;
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 0;
}
}
if (1 == flag)
{
break; //跳出这层循环,结束for后面的所有语句
}
}
}
void print(int arr[], int sz) //打印数组
{
for (int i = 0; i < sz; i++)
{
printf("%5d", arr[i]);
}
}
int main()
{
int arr[9] = { 1,2,3,4,5,6,7,8,9 };
int sz = sizeof(arr) / sizeof(arr[0]);
cmp(arr, sz); //比较大小
print(arr, sz); //打印数组
return 0;
}
微软雅黑字体
黑体
3号字
4号字
红色
绿色
蓝色