c语言3:数组
1.数组:多个相同类型元素的集合,一次性可以创建多个相同类型变量;
2.创建数组
type arr[整形常量,表示元素个数]
3.数组的使用,用下标访问操作符,0123456;arr[2]=5;双目操作符;
4.vs不支持变长数组;c99后支持;
5.字符数组不完全初始化,没有初始化默认为(0)空字符;
整型不完全初始化,也默认为0;
浮点型 :0.000000
6.int arr[10]={0};
7.根据初始化{}中元素个数来确定数组长度;
完全初始化:可显式指定长度并为所有元素赋值,如 int arr1[5] = {1, 2, 3, 4, 5}; ,也可省略长度由编译器自动推导,如 int arr2[] = {10, 20, 30, 40};
不完全初始化: 是指定长度但初始值数量少于元素个数,未赋值元素自动初始化为0(整型)或 \0 (字符型),如 int arr3[5] = {1, 2};
初始化列表确定长度:是不指定数组长度,编译器根据初始化列表的元素个数自动确定长度,属于完全初始化的特殊形式,如 int arr4[] = {1, 3, 5, 7, 9}; 另外需要注意数组长度在C99前必须是常量表达式,字符数组用双引号初始化时会自动添加 \0 作为字符串结束符。
8.千万不能数组越界,抽查,不准确;
9.数组类型:(自定义类型)
10.数组对数组的赋值不对,赋的是地址;arr2=arr1不对;数组名不可以被修改;
11.一维数组在内存中的存储,每一个内存是一个字节;每个内存单元标号叫地址;
12.计算数组元素个数, sizeof,数组在内存中所占字节数=元素个数*每个元素大小;
size=sizeof(arr)/sizeof(arr[0]);
13.int max=INT_MIN;
int min=INT_MAX;
14.#include<string.h>
strlen求字符串长度,到/0停,不包括/0;
15.数组名是首元素地址,不用加&;
16.预开辟空间够不够;
17.int main(){
char arr[] = { 'a','b','c','d','e','\0' };//字符初始化,必须加{}
char arr1[] = { "abcdef" };//字符串初始化会默认加一个/0
printf("%s", arr);
printf("%s", arr1);
printf("%d\n", sizeof(arr));//6
printf("%d\n", sizeof(arr1));//7
}
18.int main()
{
char str1[] = "***********";
char str2[] = "hello world";
int n = sizeof(str1)/sizeof(str1[0]);
int left = 0;
int right = n - 2;
while (left <= right)
{
Sleep(1000);
system("cls");
str1[left] = str2[left];
str1[right] = str2[right];
left++;
right--;
printf("%s", str1);
}
}
19.冒泡排序:
51324
15324
13524
13254
13245
12345
(1)如果某一趟排序的过程中没有发生数据的交换,说明数组已经有序了(优化);
(2)所以在每一趟排序过程中,比较的时候,比较次数可以少n次,n取决于已经排序的躺数;
两层循环;外层控制排序趟数;内层控制比较次数;
//冒泡排序
int main()
{
int arr[] = { 7,4,3,5,6,8,1,2 };
int size = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < size - 1; i++)
{
int flag = 0;
for (int j = 0; j < size - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 1;
}
}
if (flag == 0)
{
break;
}
}
for (int i = 0; i < size; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
20.二分查找(折半查找);
include <stdio.h>
int main() {
// 有序数组(升序)
int sortedArr[] = {1, 2, 3, 5, 6, 8, 43, 75};
int size = sizeof(sortedArr) / sizeof(sortedArr[0]);
int target = 6; // 要查找的目标值
int left = 0;
int right = size - 1;
int result = -1; // 初始化结果为-1(表示未找到)
// 折半查找核心逻辑
while (left <= right) {
// 计算中间索引,避免溢出
int mid = left + (right - left) / 2;
if (sortedArr[mid] == target) {
result = mid; // 找到目标,记录索引
break;
} else if (sortedArr[mid] < target) {
left = mid + 1; // 目标在右半区,调整左边界
} else {
right = mid - 1; // 目标在左半区,调整右边界
}
}
// 输出查找结果
if (result != -1) {
printf("目标 %d 在数组中的索引为:%d\n", target, result);
} else {
printf("未找到目标 %d\n", target);
}
return 0;
}
right的初始化不一样,循环的条件和调整就不一样;
21.二维数组
int arr[4][5];四行五列;
可以只指定列
二维数组是连续的一维数组;
内存是连续存放的,前提是只有通过行列创建,
22.在C语言中,字符数组是存储字符的数组,而字符串是以 '\0' (空字符)作为结束标志的字符数组,二者的核心区别在于是否包含 '\0' 。下面结合题目中的两个字符数组示例,用 strlen 和 sizeof 分析差异:
示例1: char arr1[] = {'a', 'b'};
- sizeof(arr1) :计算的是数组所占的字节数,该数组有2个 char 元素, char 类型占1字节,因此 sizeof(arr1) = 2 。
- strlen(arr1) :计算的是字符串实际长度(到 '\0' 为止),该数组未显式添加 '\0' ,会从数组起始位置一直找 '\0' ,结果是随机值(越界访问)。
示例2: char arr2[] = "acbd"; - sizeof(arr2) :字符串常量 "acbd" 会自动在末尾添加 '\0' ,数组包含 'a' 、 'c' 、 'b' 、 'd' 、 '\0' 共5个元素,因此 sizeof(arr2) = 5 。
- strlen(arr2) :统计 '\0' 之前的字符数,结果为 4 。
23.C语言二维数组有4种初始化方式,核心规则是列数不可省略:
1. 行列全指定+分行赋值: int arr[2][3] = {{1,2,3}, {4,5,6}};
2. 行列全指定+顺序赋值: int arr[2][3] = {1,2,3,4,5,6};
3. 行列全指定+部分赋值: int arr[2][3] = {{1}, {4,5}}; (未赋值元素为0)
4. 省略行数+指定列数: int arr[][3] = {1,2,3,4,5}; (行数由元素自动推导)
浙公网安备 33010602011771号