1. 数组的定义
// 定义了一个可以存储10个元素的整型数组
int arr[] = {1,2,3,4,5,6,7,8,9,10};
2. 数组的使用
#include <stdio.h>
int main() {
int arr[] = {1,2,3,4,5,6,7,8,9,10}; // 定义了一个可以存储10个元素的整型数组
int index = 0;//数组的下标
// 打印数组中的每个元素
while (index < 10) {
printf("%d\n",arr[index]);
index++;
}
return 0;
}
3.一维数组的创建和初始化
同一数组中存储的数必须满足以下两个条件:
1. 这些数的类型必须相同 2. 这些数在内存中必须是连续存储的
3.1一维数组的创建
类型说明符 数组名[ 常量 表达式];
int a[5];
在定义数组时,需要指定数组中元素的个数。方括号中的常量表达式就是用来指定元素的个数。数组中元素的个数又称数组的长度
数组中的下标是从 0 开始的(而不是 1)
3.2一维数组的初始化
1> 定义数组时给所有元素赋初值,这叫“完全初始化”
int a[5] = {1, 2, 3, 4, 5};
2>可以只给一部分元素赋值,这叫“不完全初始化”
int a[5] = {1, 2};
不完全初始化时,没有被初始化的元素自动为 0
3>字符数组和字符串
字符数组:由一个一个的字符组成的数组
char arr1[5]={'H','e'};
char arr2[8]={'a',98};
字符串:由双引号引起来的一串字符称为字符串字面值
int main() {
// 字符串--使用双引号引起的一串字符
char arr1[] = "Jack";
char arr2[] = {'J','a','c','k'};
printf("%s\n",arr1);
printf("%s\n",arr2);
}
字符串的结束标志是一个\0的转义字符,在计算字符串长度时\0是结束标志,不算作字符串的内容
3.3sizeof和strlen的区别
#include <stdio.h>
int main() {
char arr[] = "hello";
int size = sizeof(arr);
int length = strlen(arr);
printf("size = %d, length = %d",size,length);
}
sizeof的功能是计算一个数据类型的大小,这个类型可以是数组、函数、指针、对象等,单位为字 节,它的返回值是long unsigned int类型,是一个无符号整数。注意:sizeof不是一个函数,它是 一个运算符,所以它不需要包含任何头文件
strlen的功能是计算一个指定字符串的长度,函数原型是size_t strlen(const char *s),它的返回值 是size_t类型,也就是unsigned int类型,返回的是字符串的长度,需要包含头文件#inlude <string.h>,参数s是字符串首地址
区别: 1、sizeof会将空字符\0计算在内,而strlen不会将空字符\0计算在内;
2、sizeof会计算到字符串最后一个空字符\0并结束,而strlen如果遇到第一个空字符\0的话就会停止并计 算遇到的第一个空字符\0前面的长度
4.一维数组的使用
例题:int arr[8] = {10,15,27,33,78,65};
(1)要求用户输出上述数组的内容
(2)求上述数组中奇数的和
(3)求上述数据中所有元素(8个)的平均值,省略小数,输出整数。
#include <stdio.h>
int main() {
int arr[8] = {10, 15, 27, 33, 78, 65};
for (int i = 0; i < 8; i++) {
printf("数组:%d ", arr[i]);
}
printf("\n");
int sum1 = 0;
for (int i = 0; i < 8; i++) {
if (arr[i] % 2 != 0) {
sum1 += arr[i];
}
}
printf("奇数的和: %d\n", sum1);
int sum2 = 0;
for (int i = 0; i < 8; i++) {
sum2 += arr[i];
}
int average;
average = sum2 / 8;
printf("所有元素的平均值: %d\n", average);
return 0;
}
[],下标引用操作符
#include <stdio.h>
int main() {
int arr[10] = { 0 }; // 数组的不完全初始化
// 计算数组中元素的个数 方式1
int length = sizeof(arr) / sizeof(arr[0]);
// 计算数组中元素的个数 方式2
// int length = sizeof(int [10]) / sizeof(arr[0]);
// 对数组内容赋值,数组的元素是使用下标来访问的,下标从0开始
int i = 0; // 下标
for (; i < length;i++) {
arr[i] = i;
}
// 输出数组的内容
for (i = 0; i < length;i++) {
printf("%d\n",arr[i]);
}
}
总结:
1、数组元素是使用下标来访问的,下标从0开始
2、数组的大小可以通过计算获得,字符数组的长度还可以通过strlen计算获得。
3、 int arr[10] arr是数组名,同时也是变量名,该变量对应的数据类型为 int [10]
5.字符数组的输入
scanf("%s",字符数组的首地址);
功能:用户从键盘输入任意一段字符串,存放到buf中。以回车,空格,tab键盘作为用户输入的结束符号
#include <stdio.h>
int main()
{
char name[256]={0};
printf("please intput name:");
scanf("%s",name);
printf("your name is %s\n",name);
return 0;
}
Tips: 使用%s格式化输出字符串时,将第一个'\0'之前所有的字符显示到屏幕上
6.一维数组在内存中的存储
#include <stdio.h>
int main() {
int arr[10] = { 0 };
// 计算数组中元素的个数
int length = sizeof(arr) / sizeof(arr[0]);
int i = 0; // 下标
for (; i < length; i++) {
arr[i] = i;
}
// 输出数组中每个元素的地址
for (i = 0; i < length; i++) {
printf("%p\n", &arr[i]);
}
}
数组在数组中是连续存放的
7.二维数组的创建和初始化
7.1二维数组的创建
int arr[3][4];
char arr[3][5];
double arr[2][4];
7.2二维数组的初始化
int arr[3][4]={1,2,3,4};
int arr[3][5]={{1,2},{4,5}};
int arr[][4]={{2,3},{1,2}};
// 定义二维数组时,行数可以省略,系统会根据初始化元素的个数
或行数来分配对应的内存空间
8.二维数组的使用
#include <stdio.h>
int main() {
// 打印二维数组
int arr[3][5] = { {2,4,6},{1,3,5} };
// 获取行数
int rows = sizeof(arr) / sizeof(arr[0]);
// 获取每一行中元素的个数
int cells = sizeof(arr[0]) / sizeof(arr[0][0]);
for (int i = 0; i < rows;i++) { // 遍历行
for (int j = 0; j < cells;j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
利用二维数组打印杨辉三角图案
解法一 数组循环迭代
#include <stdio.h>
int main() {
int arr[10][10];
//第一列都为1,第i行第i列都为1
for (int i = 0; i < 10; i++) {
arr[i][0] = 1;
arr[i][i] = 1;
}
//第三列开始,第i行第j列的元素=第i-1行第j-1列的元素+第i-1行第j列的元素
for (int i = 2; i < 10; i++) {
for (int j = 1; j < i; j++) {
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
}
}
//输出全部数值
for (int i = 0; i < 10; i++) {
for (int j = 0; j <= i; j++) {
printf("%d", arr[i][j]);
}
printf("\n");
}
return 0;
解法二 递归法
int yanghui(int x, int y) {
if (y == 0 || x == y) return 1; //递归的终止条件
return yanghui(x - 1, y - 1) + yanghui(x - 1, y);
}
for (int x = 0; x < 5; x++) {
for (int y = 0; y <= x; y++) {
int d = yanghui(x, y);
printf("%d\t", d);
}
printf("\n");
}
9.二维数组在内存中的存储
#include <stdio.h>
int main() {
// 打印二维数组
int arr[3][5] = { {2,4,6},{1,3,5} };
// 获取行数
int rows = sizeof(arr) / sizeof(arr[0]);
// 获取每一行中元素的个数
int cells = sizeof(arr[0]) / sizeof(arr[0][0]);
for (int i = 0; i < rows;i++) { // 遍历行
int* temp = arr[i];
printf("%p\n",temp);
for (int j = 0; j < cells;j++) {
printf("%p ", &temp[j]);
}
printf("\n");
}
}
二维数组在内存中也是连续存储的
例题:char buf[100] = {0};
用户从键盘输入字符串存放到buf中,若是用户输入的字符数组中存在大写字符,则转换成小写字符,若是小写字符则不管,然后输出用户输入的数据
解法1 利用ASLLC值相差32计算
#include <stdio.h>
int main() {
char buf[100] = {0};
scanf("%s",&buf);
int i = 0;
while(buf[i] != '\0'){
if(buf[i] >='A' && buf[i] <= 'Z'){
buf[i] = buf[i] + 32;
}
i++;
}
printf("转换后的字符串: %s\n", buf);
return 0;
}
解法2 利用函数直接转换
#include <stdio.h>
#include <ctype.h>
int main() {
char buf[100] = {0};
scanf("%s",&buf);
for (int i = 0; buf[i] != '\0'; i++) {
if (isupper(buf[i])) {
buf[i] = tolower(buf[i]);
}
}
printf("转换后的字符串: %s\n", buf);
return 0;
}