服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言初阶之数组详细介绍

C语言初阶之数组详细介绍

2022-08-01 11:33build小春宝 C/C++

大家好,本篇文章主要讲的是C语言初阶之数组详细介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览

插入排序讲解

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
int main() {
    int arr[8] = { 1,2,3,4,6,7,10 };
    int i = 0;
    int sz = sizeof(arr) / sizeof(arr[0]);
    int n = 0;
    scanf("%d", &n);
    for (i = 0; i < sz - 1; i++)
        if (n < arr[i])       //找到插入位置
            break;
    for (int j = sz - 1; j > i; j--)
        arr[j ] = arr[j-1];   //每个位置向后移一位
    arr[i] = n;       //将n插入到数组中
    for (int j = 0; j < sz; j++)
        printf("%d ", arr[j]);  //打印结果
    return 0;
 }

上面这个程序可以实现往有序数组插入数的功能,而插入排序就相当于往有序的数组中不断的插入新的数,以上述的程序为基础,即可实现插入排序功能

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
int main() {
    int arr[8] = { 4,55,66,8,4,1,3,2};
    int i = 0;
    int j;
    int sz = sizeof(arr) / sizeof(arr[0]);
    for (i = 1; i < sz; i++) {      //循环插入数据
            int num = arr[i];    
        for (j = 0; j < i; j++)   //前i项顺序不正确道破循环
            if (arr[i]< arr[j])
                break;
        for (int x=i; x > j; x--) //全部右移
            arr[x] = arr[x- 1];
        arr[j] =num;     //插入数据
    }
    for (i = 0; i< sz; i++)
        printf("%d ", arr[i]);
    return 0;
 }

每一次循环都是一次插入,同样有这两层循环的特点。

二维数组

二维数组是一维数组的延伸和发展,二维数组是一维数组的嵌套,类似两层for循环,通俗来说二维数组就是一维数组的数组,二维数组的每个元素都是一个一维数组

?
1
2
int arr[5][5];
//二维数组

我们之前在九九乘法表提到的行列思想,在这里可以用上了,第一个5代表这个二维数组有五行,第二个5代表二维数组每行有五列,接下来用简单的图画来解释

C语言初阶之数组详细介绍

 我们学习二维数组的时候,以第一种形式了解即可,但要是想深究,那么就得了解第二种形式

二维数组的初始化

?
1
2
3
4
5
6
7
8
9
在学习一维数组的时候我们可以省略数组长度,由编译器自行补充
那么二维数组可以吗?
答案是可以,二维数组的行可以省略,但是列不可以,因为个数确定,列数确定,行数也可以确定
int arr[][4]={1,2,3,4,5,6,7,8};
int arr[][4]={{1,2,3},{},{4,5}};
第一种方法大家应该可以理解
第二种方法就是利用了二维数组的性质,每一行都可以看成是一个一维数组
{}里的元素就是这一行的元素

二维数组的访问

二维数组和一维数组一样,数组下标都是从零开始的,下面简单的教大家打印一个二维数组

?
1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
int main(){
int arr[4][4] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 };
    for (int i = 0; i < 4; i++) {
        int j = 0;
        for (j = 0; j < 4; j++)
            printf("%2d ", arr[i][j]);
        printf("\n");
    }
return 0;
}

是不是和打印九九乘法表的程序很类似呢,同样的,二维数组也离不开两层循环,由此可见两层循环的重要性,至于二维数组的深一层使用,等我们讲解扫雷和三子棋的时候就会有所了解

n维数组

n维数组实际上是对n-1维数组的拓展和延伸,按照研究二维数组的思维就可以一步一步的研究了

字符数组

接下来便是我们今天的主菜,字符数组

字符数组和字符串

C语言标准中并没有字符串类型,这也使得与字符串有关的操作总是需要字符串函数来进行,字符数组大多数情况下就是用来储存字符串的,但字符数组有时候并不能看做字符串。

?
1
2
3
字符串是以\0为结束标志
char a[5]={'a','b','c','d','e'};
这里的字符数组a里并没有\0,强行以字符串形式打印会出错

C语言初阶之数组详细介绍

 当我们没有对字符数组初始化,并且以字符形式输入的时候,忽略了\0,也会出现这种状况,当然大多数情况下我们还是可以把字符数组当成字符串来用的

字符数组的输入输出

字符数组的输入方式大致分为两种字符形式输入和字符串形式输入

字符形式输入输出

?
1
2
3
4
5
6
7
8
9
10
//实现输入输出之前我们需要用字符数组作为容器
#include<stdio.h>
int main() {
    char arr[5] = { 0 };
    for (int i = 0; i < 5; i++)
        scanf("%c", &arr[i]);
    for (int i = 0; i < 5; i++)
        printf("%c", arr[i]);
    return 0;
}

之前提到了getchar和putchar两个库函数,接下来使用这两个专门用来字符输入输出的函数来进行

?
1
2
3
4
5
6
7
8
9
#include<stdio.h>
int main() {
    char arr[5] = { 0 };
    for (int i = 0; i < 5; i++)
        arr[i] = getchar();
    for (int i = 0; i < 5; i++)
        putchar(arr[i]);
    return 0;
}

字符串输入输出

?
1
2
3
4
5
6
7
#include<stdio.h>
int main() {
    char arr[40] = { 0 };
    scanf("%s", arr);
    printf("%s\n", arr);
    return 0;
}

接下来使用puts,gets两个库函数

?
1
2
3
4
5
6
7
8
#include<stdio.h>
int main() {
    char arr[40] = { 0};
    gets(arr);
    puts(arr);
    return 0;
}
//顺带一提,puts在打印完字符串之后会自动换行

字符串函数的简单使用

之前也提到了字符串的操作往往需要使用字符串函数,除了上述函数之外我们之前函数篇介绍的字符串函数我来简单教大家使用一下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
#include<string.h>
int main() {
    char arr[10] = { 0 };
    strcpy(arr, "abc");//字符串拷贝,将abc拷贝到arr中
    strcat(arr, "def");//字符串追加,将def追加到arr的\0之后
    int len = strlen(arr);//求字符串长度,不包括\0
    int cmp = strcmp(arr, "abcdef");//字符串比较,第一个大于第二个字符串返回大于零的数,
                                    //等于返回0,小于返回小于零的数
    printf("%d %d", len, cmp);
    printf("%s\n", _strupr(arr));//将字符串全部大写
    printf("%s\n", _strlwr(arr));//将字符串全部小写
    return 0;
}

C语言初阶之数组详细介绍

 根据注释就可以推算结果,当然我这里的打印字符串也使用了利用函数返回值的特点

综合使用字符串函数

将下来把我们的所学知识全部串起来,完成下面的字符串排序

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<stdio.h>
include<string.h>
int main() {
char arr[5][20] = { "tiger","pander","eleplant","rabbit","lion" };//声明并初始化二维字符数
                                                                  //组arr
    int i, j,flag;                               //i,j循环变量,flag为判断二维数组是否有序
                                                 //的变量
    char t[20] = { '\0' };
    for (i = 0; i < 5; i++)                   //打印二维字符数组,以字符串形式
        puts(arr[i]);
    printf("以上为未排序的二维字符数组\n");   //   给程序打印结果进行解释
    for (i = 0; i < 4; i++) {
            flag = 1;
        for (j = 0; j < 4; j++) {
            if (strcmp(arr[j], arr[j + 1]) > 0) {            //若前一个字符串的ascll值大于
                                                       //后一个字符串,则进行字符串位置交换
                strcpy(t, arr[j]);
                strcpy(arr[j], arr[j+1]);
                strcpy(arr[j + 1], t);
                flag = 0;
            }          
        }
        if (flag)                                        //若一轮循环下来flag仍然等于1,则
                                    //未进行位置互换,此时打破循环,减少没必要的操作
            break;
    }
    for (i = 0; i < 5; i++)                   //打印气泡法排序后的二维字符数组,以字符串形式
        puts(arr[i]);
    return 0;
}

总结

到此这篇关于C语言初阶之数组详细介绍的文章就介绍到这了,更多相关C语言数组内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_62753802/article/details/122213895

延伸 · 阅读

精彩推荐
  • C/C++c++ string的erase删除方法

    c++ string的erase删除方法

    这篇文章主要介绍了c++ string的erase删除方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    _icrazy_10482021-10-14
  • C/C++C语言实现BMP图像的读写功能

    C语言实现BMP图像的读写功能

    这篇文章主要介绍了C语言实现BMP图像的读写功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    小丑程序员6932021-11-01
  • C/C++C++自定义函数判断某年某月某日是这一年中第几天

    C++自定义函数判断某年某月某日是这一年中第几天

    这篇文章主要介绍了C++自定义函数判断某年某月某日是这一年中第几天的方法,涉及C++日期与时间操作相关技巧,需要的朋友可以参考下...

    宾宾琪琪6512021-04-05
  • C/C++C和MFC巧妙获取外网IP的两种实现方法

    C和MFC巧妙获取外网IP的两种实现方法

    这篇文章主要介绍了C和MFC巧妙获取外网IP的两种实现方法,功能非常的实用,需要的朋友可以参考下...

    C语言程序设计9992021-01-23
  • C/C++C语言堆栈入门指南

    C语言堆栈入门指南

    我身边的一些编程的朋友以及在网上看帖遇到的朋友中有好多也说不清堆栈,所以我想有必要给大家分享一下我对堆栈的看法,有说的不对的地方请朋友们...

    C语言教程网8422021-01-13
  • C/C++详谈c++跨平台编码的问题

    详谈c++跨平台编码的问题

    下面小编就为大家带来一篇详谈c++跨平台编码的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    selfree12372021-05-28
  • C/C++C语言之循环语句详细介绍

    C语言之循环语句详细介绍

    大家好,本篇文章主要讲的是C语言之循环语句详细介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览...

    匿名人士0077372022-07-22
  • C/C++C++移动操作,RVO和NRVO详细

    C++移动操作,RVO和NRVO详细

    本文将讨论了何时C++会自动进行移动操作,并且说明了复制消除,RVO和NRVO优的化等香瓜吧资料,需要的小伙伴可以参考一下...

    VisualGMQ11372022-01-19