当前位置: 首页 > news >正文

7-c语言中的数组

一.数组的定义

     数组: 相同数据类型变量的集合。数组是为⽤户处理多个数据⽽设计, 使⽤数组可以给多个变量分配多 个连续的内存,节省变量名的消耗。

     格式:

      数据类型 数组名 [元素的个数];

     注意 :

     (1) 数据类型 : char,short,int float,double,long ,long long

     (2) 数组名 : 合法的标识符,以数字,字符,下划线组成,⾸个单词要是字⺟或下划线

     (3) 元素个数: 要求是⼀个确定的常量值 

内存分布图:

变量类型的查看方法:去掉变量名剩下的就是类型

以 int  t[5]为例子 :

1.  数组的成员:t[0] t[1] t[2] t[3] t[4]

2.  每个成员的类型: int

3.  整个数组的⼤⼩: sizeof(int [5]) 或 sizeof(a)

4.  数组⼀个元素的⼤⼩: sizeof(a[0])

5.  元素的个数: sizeof(a)/sizeof(a[0])

思考:数组⾸地址 t 编译器是如何找到对应 t[0],t[1],t[2] 内存块的数据呢?

t[0]=====> 表示数组的⾸地址 a 偏移 0 个元素的⼤⼩ ,[] 取该地址中的内容

t[1]=====> 表示数组的⾸地址 a 偏移 1 个元素的⼤⼩ ,[] 取该地址中的内容

t[2]=====> 表示数组的⾸地址 a 偏移 2 个元素的⼤⼩ ,[] 取该地址中的内容

示例代码1:

int main()
 {
        int  a[5];
        printf("sizeof(int [5]) = %ld\n",sizeof(int [5]));
        printf("sizeof(a) = %ld\n",sizeof(a));
        printf("sizeof(a[0]) = %ld\n",sizeof(a[0]));
        printf("len = %ld\n",sizeof(a)/sizeof(a[0]));
        return 0;
 }

示例代码2:

二.数组的初始化

     在定义数组的同时,给数组中的每⼀个成员变量,赋予⼀个初始的值。

     例如1 :    int a[5] = {10,20,30,40,50};

     例如2:     int a[5] = {10,20,30}; 部分初始化 : 未初始化的值,系统默认为 0

示例代码1:

#include <stdio.h>
 int main()
 {
        int a[5] = {10,20,30,40,50};
        int b[5] = {1,3,5};
        int len = 5,i = 0;

        printf("a数组: ");
        for(i = 0;i < len;i++)
        {
                printf("%d ",a[i]);        
        }

        printf("\n");
        printf("===========================\n");

        printf("b数组: ");
        for(i = 0;i < len;i++)
        {
                printf("%d ",b[i]);        
        }
        printf("\n");
        printf("===========================\n");
        return 0;
 }

示例代码2:

#include <stdio.h>
 int main()
 {
        int c[] = {1,3,4,5,6,7,2,3,4,5,6};
        int i = 0,n = 0;
        int len = sizeof(c)/sizeof(c[0]);
        for(i = 0;i < len;i++)
        {
                printf("%d ",c[i]);        
                if(c[i] % 2 == 0)
                        n++;
        }
        printf("\n");
        printf("偶数的个数= %d\n",n);
        return 0;
 }



运⾏结果:
1 3 4 5 6 7 2 3 4 5 6 

偶数的个数= 5

练习:

int a[8] = {10,15,27,33,78,65};

(1) 要求⽤户输出上述数组的内容

(2) 要求求上述数组中奇数的和。

(3) 求上述数据中所有元素 (8 个 ) 的平均值 , 省略⼩数 , 输出整数。

#include <stdio.h>

int main() 
{
    int arr[] = {10,15,27,33,78,65}; // 示例数组
    int size = sizeof(arr)/sizeof(arr[0]);
    int sum_odd = 0;
    int total_sum = 0;

    // (1) 输出数组内容
    printf("数组内容: ");
    for(int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    // (2) 计算奇数之和
    for(int i = 0; i < size; i++) {
        if(arr[i] % 2 != 0) {
            sum_odd += arr[i];
        }
    }
    printf("奇数和: %d\n", sum_odd);

    // (3) 计算平均值(整数)
    for(int i = 0; i < size; i++) {
        total_sum += arr[i];
    }
    int average = total_sum / size;
    printf("平均值: %d\n", average);

    return 0;
}

三.字符数组和字符串

      1.定义:

         字符数组: 它是⼀个 char/unsigned char 类型的数组,常⽤来存放字符或字符串。

         char buf[5] = {'A','B','C','D','E'};

         思考 : 字符数组中只能存放字符或字符串 , 这句话对不对?

         不对,还可以存放整数 char buf[5] = {65,66,67,68,69};

         三种写法:

三种写法:
 char buf[30] = "welcome";
 char buf[30] = {"welcome"};
 char buf[30] = {'w','e','l','c','o','m','e','\0'};

示例1:

#include<stdio.h>

int main()
{
    char buf1[] = {"hello"};
    char buf2[] = "hello";
    char buf3[] = {'h', 'e', 'l', 'l', 'o', '\0'};
    int i = 0;

    printf("buf1 :");
    for(i = 0; buf1[i] != '\0'; i++)
    {
        printf("%c", buf1[i]);
    }
    printf("\n");
    printf("=======================\n");

    printf("buf2 :");
    for(i = 0;buf2[i] != '\0';i++)
    {
        printf("%c ",buf2[i]);        
    }
        printf("\n");
    printf("===============================\n");

    printf("buf3 : ");
    for(i = 0;buf3[i] != '\0';i++)
    {
       printf("%c ",buf3[i]);        
    }
        printf("\n");
    
    
    return 0;
}

输入:

char buf[100] = {0};
scanf("%s",字符数组的⾸地址);   

功能:⽤户从键盘输⼊任意⼀段字符串,存放到buf中。以回⻋,空格,tab键盘作为⽤户输⼊的结束符号。

输出:

char buf[] = {"hello world"};
printf("%s\n",字符数组的⾸地址); 

功能: 输出数组中第⼀个'\0'之前所有的字符,并显示到屏幕上。若是⽤户对应字符数组中没有'\0',则⽤户输出乱码。

示例2:

#include <stdio.h>
 int main()
 {
        char name[100];
        printf("please input your name : ");
        scanf("%s",name);
        printf("NAME\n");
        printf("%s\n",name); 
        return 0;
 }

练习:

char buf[100] = {0};

要求⽤户从键盘输⼊字符数串存放到 buf 中 ,

若是⽤户输⼊的字符数组中存在⼤写字符 , 则转换为⼩写字符 , 若是⼩写字符则不管 , 然后输出⽤户输⼊的数据

#include <stdio.h>
#include <ctype.h>

int main()
 {
    char buf[100] = {0};
    
    printf("请输入字符串: ");
    fgets(buf, sizeof(buf), stdin);
    
    // 转换大写字母为小写
    for(int i = 0; buf[i] != '\0'; i++) 
     {
        if(isupper(buf[i])) 
        {
            buf[i] = tolower(buf[i]);
        }
     }
    
    printf("转换后的字符串: %s", buf);
    return 0;
}

1- 使用 fgets 安全读取用户输入(防止缓冲区溢出)
2- 遍历字符串,使用 isupper 检查是否大写字母
3- 使用 tolower 将大写字母转换为小写
4- 小写字母和其他字符保持不变

四.二维数组

1.定义

       ⼀维数组是相同数据类型元素的集合,但是只能表示⼀⾏数据。 若是存在⾏和列相关的信息 (例如矩 阵),我们就需要⽤⼆位数组来表示.

  2.  定义方式

 数据类型 数组名 [行数][列数];

示例:

int a[3][4];  


在内存中按照还是按照⼀维数组的顺序排序的。
只不过,为了⽅便⼈们识别,我们是按照⼆维的来理解。


0xd10     1     a[0][0]
0xd14     2     a[0][1] 
0xd18     3     a[0][2]
0xd1c     4     a[0][3] 
0xd20     5     a[1][0]
0xd24     6     a[1][1] 
0xd28     7     a[1][2]
0xd2c     8     a[1][3] 
0xd30     9     a[2][0]
0xd34     10    a[2][1] 
0xd38     11    a[2][2]
0xd3c     12    a[2][3] 

 理解:

3.二维数组求大小

数组大小:sizeof (arr)

一个元素大小:sizeof (arr[0][0])

一行大小:sizeof arr[0] 

行数: sizeof arr / sizeof arr[0]

列数:sizeof arr[0]  /  sizeof (arr[0][0])

示例代码:二维数组遍历

#include <stdio.h>
 int main()
 {
        int a[3][2];
        int i = 0,j = 0;
        printf("please input %d data : ",3 * 2);
        for(i = 0;i < 3;i++) 
        {
                for(j = 0;j < 2;j++)
                {
                        scanf("%d",&a[i][j]);        
                }
        }
        for(i = 0;i < 3;i++) 
        {
            for(j = 0;j < 2;j++)
            {
                    printf("%d ",a[i][j]);
            }
            printf("\n");
        }
        return 0;
 }

练习:

定义⼀个 int a[10][10] 的数组,利⽤⼆维数组输出下列杨辉三⻆的图案 . 1

#include <stdio.h>

int main() {
    int a[10][10] = {0};
    
    // 生成杨辉三角数据
    for(int i = 0; i < 10; i++)
    {
        a[i][0] = 1;  // 每行第一个元素为1
        for(int j = 1; j <= i; j++) {
            a[i][j] = a[i-1][j-1] + a[i-1][j];
        }
    }
    
    // 输出杨辉三角
    for(int i = 0; i < 10; i++) 
    {
        // 输出空格对齐
    for(int k = 0; k < 10 - i; k++) 
        {
            printf("  ");
        }
        // 输出数字
        for(int j = 0; j <= i; j++) 
        {
            printf("%4d", a[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}

运行结果:

1- 定义一个10x10的二维数组
2- 使用双重循环生成杨辉三角数据:
3- 每行第一个元素设为1
4- 其他元素等于上一行前一个位置的值和上一行同列的和
5- 输出时添加空格对齐,使显示更美观
6- 使用%4d格式化输出保持数字对齐

相关文章:

  • TQTT_KU5P开发板教程---实现流水灯
  • 【技术】Ruby 生态概念速查表,通过对比nodejs生态(入门)
  • Linux 网络编程套接字
  • GIS-AI 融合引擎架构:智慧景区导览系统的毫秒级响应与千级并发优化实战
  • javaSE学习(前端基础知识)
  • GD32F303----内部Flash读写
  • Pytorch深度学习框架60天进阶学习计划 - 第39天:联邦学习系统
  • [MySQL] 表的内连和外连
  • 解决【远程主机可能不符合 glibc 和 libstdc++ Vs code 服务器的先决条件】
  • 基于Axure的动态面板旋转实现抽奖转盘
  • CAD导入arcgis中保持面积不变的方法
  • K8S-证书更新时-误删除组件-
  • OpenHarmony人才认证证书
  • SpringMVC基础三(json)
  • 学习MySQL的第七天
  • 【软考系统架构设计师】信息系统基础知识点
  • python基础14 gRPC的流式(stream)传输(二)
  • 网络互连与互联网2
  • 镜像端口及观察端口的配置
  • WebPages 对象
  • 网站的中英文切换代码/seo推广排名
  • 小程序代运营/荆门网站seo
  • 微信小程序游戏制作/郑州seo推广
  • 品牌网站制作流程/优化关键词的方法包括
  • 专业的网站建设公司排名/买卖网站
  • 动效做的好的网站/最近的新闻事件