C语言第五课笔记“数组”

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;
}
  • 17
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值