二维数组---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
数组基本概念
变量类型 变量名;
元素类型 数组名[元素个数]; // 数组中保存的每一个数据,我们称之为元素
特点:数组只能存放同一种数据类型
数组中的每一个元素都有一个索引号,索引号从0开始
部分初始化, 没有赋值的元素默认是0
int scores[3];
scores[0] = 55;
scores[1] = 66;
scores[2] = 77;
int v1 = scores[0];
printf("%d\n", v1);
输出结果就是 55
数组[]中的元素个数只能写整型常量,以及返回值是整型常量的表达式
int scores6[10.1] = {1, 3};//这个就是错误的 元素个数只能是整型常量
int scores7[1 + 1] = {1, 3};//返回值是整型常量的表达式
通过变量定义数组,如果没有对数组进行初始化,里面存放的是一些垃圾数据(随机值)
在定义数组的同时进行初始化,可以省略元素个数,会自动的计算出数组元素的个数
例如 int scores[] = {1,3};
要想给数组一次性赋值(给数组中所有的元素赋值)只能在定义数组的同时,
如果定义完数组之后,就不能再对数组进行一次性的赋值
int scores13[3];
scores13 = {1, 3, 5};// 错误写法
int scores13[3]={1, 3, 5}//正确写法
数组的地址就是它第0个元素的地址,数组名就是数组的地址
&cs == &cs[0] == cs
数组元素存放值是从小到大, 而每一个元素存值又是从大到小
因为内存寻址从大到小,所以先定义的数组的地址比后定义的地址大
基本数据类型作位函数参数是值传递
数组作为函数参数传递的是地址
当数组作为函数参数传递的时候,可以省略[]中的元素个数
当数组作为函数参数传递的时候,会自动转换成"指针类型"
而指针在当前操作系统mac 下占用8个字节
想在函数中动态计算数组的元素个数是不行的,因为指针类型占8个字节
实例:遍历数组
int ages[3] = {11,25,27};
int length =sizeof(ages) /sizeof(ages[0]);
for (int i =0; i < length; i++) {
printf("ages[%d] = %d\n", i, ages[i]);
}
>. 选择排序原理:依次选择数组中过的每一个元素和其他元素进行比较
当内循环执行完一次(比较完一次), 最值出现在头角标上
例如 要求从键盘输入4个0~2000的数值,排序后输出
#include <stdio.h>
void printArray(int array[],int length)
{
for (int i =0; i < length; i++) {
printf("array[%d] = %d\n", i, array[i]);
}
}
void swap(int array[],int i,int j)
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
int main(int argc,constchar * argv[])
{
int nums[4] = {1000,500,1,5};
int length =sizeof(nums) /sizeof(nums[0]);
printArray(nums, length);
// -1是因为最后一个元素已经不用比较了
for (int i =0; i <4 - 1; i++) {
for (int j = i +1; j <4; j++) {
if (nums[i] > nums[j]) {
swap(nums, i, j);
}
}
}
printArray(nums, length);
return0;
}
>.冒泡排序原理: 冒泡排序是拿相邻的两个元素进行比较
特点: 内循环执行完一次(完整的比较完一次),最值出现在尾角标上
#include <stdio.h>
void printArray(int array[],int length)
{
for (int i =0; i < length; i++) {
printf("array[%d] = %d\n", i, array[i]);
}
}
void swap(int array[], int i, int j)
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
int main(int argc, const char * argv[])
{
int nums[4] = {1000,500, 1, 5};
int length = sizeof(nums) / sizeof(nums[0]);
printArray(nums, length);
for (int i =0; i <4; i++) {
// -1是为了防止角标越界
// -i 是为了每一次内循环少比较一个
for (int j =0; j <4 - 1 - i; j++) {
// printf("j = %d, j+1 = %d\n", j, j + 1);
if (nums[j] > nums[j+1]) {
swap(nums, j, j+1);
}
}
}
printArray(nums, length);
return0;
}
元素类型 数组名[元素个数];
元素类型: 说明将来数组中存放元素的类型
元素个数: 说明将来数组中能存放多少个元素
元素类型 数组名[行数][列数];
元素类型 数组名[有多少个一维数组][每一个一维数组的元素个数];
二维数组本质依然是一个一维数组, 只不过他的每一个元素又是一个一维数组而已
二维数组可以省略行数,会自动根据初始化的值计算出有多少个一维数组
注意:二维数组不能省略列数,必须明确的告诉二维数组中每一个一维数组可以存放多少个元素
要给二维数组进行一次性的赋值,只能在定义二维数组的时候
折半查找
注意点:折半查找被查找的数组必须是有序的
查表法写法
void printHex(int num)
{
1.定义一个数组, 作为取出的八进制的结果查询的表
char cs[] = {'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f'};
2.定义一个数组,用于保存查询后的结果
char rs[8] = {0};
3.定义变量存储结果的索引,指向了结果数组的最大下标
int pos = sizeof(rs) / sizeof(rs[0]); // 8
while (num != 0) {
取出num的最低4位
int index = num & 15;
把取出的值当作索引取结果数组中查询
char c = cs[index];
把查询出来的结果保存到数组中
rs[--pos] = c;
右移4位,方便下一次取值
num = num >> 4;
}
for (int i = pos; i < 8; i++) {
printf("%c", rs[i]);
}
printf("\n");
}
---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------