C语言学习——3
一、数组
- 数组:相同元素的集合,在内存中会分配——片连续的空间
- 构造数据类型之一 int a[6]
- 数组是具有-定顺序关系的若千个变量的集合,组成数组的各个变量称为数组的元素。
- 数组中各元素的数据类型要求相同,用数组名和下标确定。数组可以是- -维的,也可以是多维的。
1.定义
所谓一维数组是指只有一个下标的数组。它在计算机的内存中是连续存储的。
C语言中,一维数组的说明一般形式如下:
<存储类型> <数据类型> <数组名>[<表达式>];
eg:
int array[10];
下标:
访问元素时,需要通过下标确定要访问的元素
下标从0开始,到n-1结束
例如: arr[0] ~ arr[5]
赋值:
arr[1] = 10; //"只能单独给某个元素赋值"
计算数组所占空间大小:
sizeof(数组名);
计算元素个数:
sizeof(数组名)/sizeof(元素数据类型)
2.初始化
-
完全初始化
int arr[5] = {1,2,3,4,5};
-
部分初始化
int arr[5] = {1,2,3}; //未赋值的元素为0
-
利用下标初始化
int arr[5] = {0} //初始化(全0) arr[0] = 1; arr[1] = 2; int arr[5] = {10 , [2] = 3 , 6} //初始化 //输出结果: 10 0 3 6 0
-
自动计数原则(不定义数组的大小)
int arr[] = {1,2,3}; //必须赋初值,共有3个元素
-
可变数组(C99语法才支持)
可变数组不能初始化,一旦被定义,数组大小就不会改变
int n = 10; int a[n]; a[0] = 10;
3.赋值
int a[5];
a[0] = 10;
a[1] = 20;
int a[5] = {1,2,3,4,5};
int b[5];
b = a; //错误,数组不可以直接复制
注意:
1.只有在初始化时,才可以对多个元素进行操作,后续的所有使用操作都只能使用单个元素
2.数组越界问题
练习
定义一个数组,遍历数组并将所有元素加起来求和并打印
/*===============================================
* 文件名称:eg1.c
* 创 建 者:青木莲华
* 创建日期:2025年07月16日
* 描 述:定义一个数组
================================================*/
#include <stdio.h>
int main(int argc, char *argv[])
{
int arr[5] = {1,2,3,4,5};
for(int i = 0 ; i < 5 ; i++)
printf("arr[%d] = %d\n",i,arr[i]);
return 0;
}
运行截图
二、字符型数组
char str[32] = {0};
char str[32] = "hello world";
//遍历字符串
char str[] = "abcdefg";
for(i = 0 ; str[i] != '\0' ; i++)
printf("%c",str[i]);
printf("\n");
//输出结果: abcdefg
//字符串遍历以结束符'\0'为结束位置
字符型数组 又叫 字符串
- C语言中没有字符串数据类型,但是有字符串常量
- 字符串由字符和结束符('\0')组成
- 字符串在C语言中一般使用数组或者指针存储
- 只要是用" " 双引号引用的都叫字符串
- 字符串长度不包括结束符,但是字符个数会包含结束符
练习
输入一个数组的所有元素,找出最大值及其下标
/*===============================================
* 文件名称:eg2.c
* 创 建 者:青木莲华
* 创建日期:2025年07月16日
* 描 述:找数组最大值
================================================*/
#include <stdio.h>
int main(int argc, char *argv[])
{
int arr[10] = {0};
int i = 0,max = 0,index = 0;
while(i < 10)
{
scanf("%d",&arr[i]);
getchar();
i++;
}
while(i >= 0)
{
if(arr[i] > max)
{
max = arr[i];
index = i;
}
i--;
}
printf("The array's max_num is : %d\n",max);
printf("The max_num's index is : %d\n",index);
return 0;
}
运行截图
1.字符串相关函数
#include <string.h>
1. strlen字符串长度函数
size_t strlen(const char *s);
//参数:
const char *s; //字符串首地址
//返回值:
size_t : //字符串长度 long型
//eg:
char str[] = "hello world";
printf("%ld\n",strlen(str));
printf("%ld\n",strlen("1111111"));
//长度不包含结束符
2.strcpy字符串拷贝函数
/*
注意:
strcpy会拷贝'\0'
*/
char *strcpy(char *dest, const char *src);
/*
参数:
char *dest : 拷贝目标首地址
const char *src : 被拷贝字符串的首地址
返回值:
char *:返回拷贝的目标的首地址
*/
//拷贝指定数目(不完全拷贝)
char *strncpy(char *dest,const char *src , size_t n);
/*
参数:
char *dest : 拷贝目标首地址
const char *src : 被拷贝字符串的首地址
size_t n : 拷贝字符的数目
返回值:
char *:返回拷贝的目标的首地址
*/
eg:
int main(){
char str[] = "hello world";
char str2[strlen(str)+1];
//完全复制
strcpy(str2,str);
printf("str2 = %s\n",str2);
//替换string (这里设置为0 清空了数组)
memset(str2 , 0 ,sizeof(str2));
//部分复制
strncpy(str2,str,5);
printf("str2 = %s\n",str2);
}
3.strcat字符串追加函数(拼接)
/*
注意 : 会追加结束符
*/
char *strcat(char *dest,const char *src);
/*
参数:
char *dest : 拷贝目标首地址
const char *src : 被追加字符串的首地址
返回值:
char *:返回追加后字符串的首地址
*/
char *strncat(char *dest,const char *src,size_t n);
/*
参数:
char *dest : 拷贝目标首地址
const char *src : 被追加字符串的首地址
size_t : 追加的字符个数
返回值:
char *:返回追加后字符串的首地址
*/
eg:
char s1[] = {"hello "};
char s2[] = {"world"};
strcat(s1,s2);
strncat(s1,s2,5);
4.strcmp字符串比较函数
int strcmp(const char *s1,const char *s1);
/*
参数:
const char *s1; 字符串1的首地址
const char *s2; 字符串2的首地址
返回值:
如果两个字符串相同,返回0
不相同返回非0
比较逻辑是用两个字符串的ASCII码相减的方式来比较的
*/
eg:
char s1[] = {"hello "};
char s2[] = {"world"};
//接收返回参数 0 为相同 非0为不同
int ret = strcat(s1,s2);
练习
实现strlen功能,在终端输入字符串打印并输出字符串长度
/*===============================================
* 文件名称:eg3.c
* 创 建 者:青木莲华
* 创建日期:2025年07月16日
* 描 述:手动实现strlen功能
================================================*/
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char str[20];
gets(str);
int length = 0,i = 0;
while(str[i] != '\0')
{
i++;
length++;
}
printf("length : %d\n",length);
printf("str : %s\n",str);
return 0;
}
三、多维数组
/*
<存储类型> <数据类型> <数组名>[<常量表达式1>] [<常量表达式2>]....
*/
int a[2][3]; //二维数组 2行3列
int b[1][2][3]; //三位数组
1.初始化:
/*
定义方式:
数据类型 数组名[常量表达式1][常量表达式2]
*/
//1.完全初始化
int a [3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int a [2][3] = {{1,2,3} , {2,3,4}};
//2.部分初始化
int a[3][4] = {1,2,3,4,5};
int a[3][4] = {{1,2,3} , {4} , {5}}; //a[1][0] = 4 a[2][0] = 5
int a[3][4] = {{1,[2]=2,3},{[2]=4},{5}};
//3.自动计数原则(只能缺省第一个,不能缺省第二个)
int a[][4] = {1,2,3,4};
2.赋值
int a[3][4];
a[0][0] = 10;
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
//遍历
for(int i = 0 ; i < 3 ; i++)
{
for(int j = 0 ; j < 4 ; j++)
{
printf("arr[%d][%d] = %d\n",i,j,a[i][j]);
}
}
char arr[][] = {"hello" , "world" , "!"};
3.二维字符型数组
char arr[3][32] = {"hello","world","abc"};
puts(arr[0]); //输出: hello
puts(arr[1]); //输出: world
练习:冒泡排序
/*===============================================
* 文件名称:eg4.c
* 创 建 者:青木莲华
* 创建日期:2025年07月16日
* 描 述:冒泡排序
================================================*/
#include <stdio.h>
int main(int argc, char *argv[])
{
int arr[8] = {32,12,5,9,8,11,2,3};
int len = sizeof(arr)/sizeof(int),temp = 0;
for(int k = 0 ; k < len; k++)
{
printf("%4d",arr[k]);
}
printf("\n");
for(int i = 0 ; i < len - 1; i++)
{
for(int j = 0 ; j < len - 1 - i ; j++)
{
if(arr[j] > arr[j + 1])
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for(int k = 0 ; k < len; k++)
{
printf("%4d",arr[k]);
}
printf("\n");
return 0;
}
作业:
-
二维数组冒泡排序
/*=============================================== * 文件名称:work1.c * 创 建 者:青木莲华 * 创建日期:2025年07月16日 * 描 述:二维数组冒泡排序 ================================================*/ #include <stdio.h> int main(int argc, char *argv[]) { int arr[3][6] = {{23,5,43,2,58,8} , {33,44,22,11,77,5} , {12,31,11,56,7,1}}; int temp = 0; for(int i = 0 ; i < 3 ; i++) { for(int j = 0 ; j < 5 ; j++) { for(int k = 0 ; k < 5 - j ; k++) { if(arr[i][k] > arr[i][k + 1]) { temp = arr[i][k]; arr[i][k] = arr[i][k + 1]; arr[i][k + 1] = temp; } } } } for(int i = 0 ; i < 3 ; i++) { printf("arr[%d] : ",i); for(int j = 0 ; j < 6 ; j++) printf("%3d",arr[i][j]); printf("\n"); } return 0; }
-
手动实现strcpy、strcmp 功能
/*=============================================== * 文件名称:work2.c * 创 建 者:青木莲华 * 创建日期:2025年07月16日 * 描 述:手动实现strcpy、strcmp函数功能 ================================================*/ #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { //1.初始化参数 char arr1[32]; char arr2[32]; char arr3[32] = "hello world!"; int i = 0,flag = 1; //2.输入字符串 printf(">:"); gets(arr1); //3.复制 while(arr1[i] != '\0') { arr2[i] = arr1[i]; i++; } arr2[i] = '\0'; printf("copy >: "); puts(arr2); //4.比较 i = 0; //先判断两字符串长度是否相等 if(strlen(arr1) == strlen(arr3)) { while(arr1[i] != '\0') { if(arr1[i] != arr3[i]) flag = 0; i++; } } else flag = 0; if(flag) printf("is_equal\n"); else printf("not_equal\n"); return 0; }
-
选择排序
/*=============================================== * 文件名称:work3.c * 创 建 者:青木莲华 * 创建日期:2025年07月16日 * 描 述:选择排序 ================================================*/ #include <stdio.h> int main(int argc, char *argv[]) { int arr[10] = {32,4,6,43,77,95,45,68,12,98}; int len = sizeof(arr)/sizeof(int); int temp,index; //未排序输出 printf("before>:"); for(int i = 0 ; i < len ; i++) { printf("%3d",arr[i]); } printf("\n"); //选择排序 for(int i = 0 ; i < len - 1 ; i++) { index = i; for(int j = i + 1 ; j < len ; j++) { if(arr[index] > arr[j]) { index = j; } } //交换 temp = arr[i]; arr[i] = arr[index]; arr[index] = temp; } //输出 printf("after>:"); for(int i = 0 ; i < len ; i++) { printf("%3d",arr[i]); } printf("\n"); return 0; }
-
逆序输出字符串
/*=============================================== * 文件名称:work4.c * 创 建 者:青木莲华 * 创建日期:2025年07月16日 * 描 述:逆序输出字符串 ================================================*/ #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { char str[32]; printf(">:\n"); gets(str); for(long i = strlen(str) - 1 ; i >= 0 ; i--) { printf("%c",str[i]); } printf("\n"); return 0; }
- 打印杨辉三角前10行
/*===============================================
* 文件名称:work5.c
* 创 建 者:青木莲华
* 创建日期:2025年07月16日
* 描 述:输出10行杨辉三角
================================================*/
#include <stdio.h>
int main(int argc, char *argv[])
{
//初始化
int arr[10][10] = {0};
arr[0][0] = 1;
arr[1][0] = 1;
arr[1][1] = 1;
//输出第一行
printf("%-5d\n",arr[0][0]);
//输出第二行
printf("%-5d%-5d\n",arr[1][0],arr[1][1]);
for(int i = 2 ; i < 10 ; i++)
{
for(int j = 0 ; j <= i ; j++ )
{
if(j == 0 || j == i)
{
arr[i][j] = 1;
printf("%-5d",arr[i][j]);
continue;
}
else
{
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
printf("%-5d",arr[i][j]);
}
}
printf("\n");
}
return 0;
}