数组-C语言(初阶)

目录

一、一维数组的创建和初始化

        1.1 数组的创建

        1.2 数组的初始化

        1.3 一维数组的使用

二、二维数组的创建和初始化

        2.1 二维数组的创建

        2.2 二维数组的初始化

        2.3 二维数组的使用

        2.4 二维数组在内存中的存储

三、数组越界 

四、数组作为函数参数

         4.1 数组名

        4.2 冒泡排序函数


一、一维数组的创建和初始化

        1.1 数组的创建

        数组是一组相同类型元素的集合。

type_t arr_name [const_n];

       type_t 指数组的元素类型,arr_name数组名,const_n 是一个常量表达式,用来指定数组的大小。

        示例

int arr1[10];
 

int count = 10;
int arr2[count];

        注意:数组创建,在C99标准之前, [ ] 中要给一个常量才可以,不能使用变量;C99标准支持变长数组,数组大小可以使用变量确定,但不能初始化

        1.2 数组的初始化

        数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值。

        示例

int arr1[10] = {1,2,3};
int arr2[] = {1,2,3,4};
int arr3[5] = {1,2,3,4,5};
char arr4[3] = {'a',98, 'c'};
char arr5[] = {'a','b','c'};

        数组在创建的时候若想不指定数组确定的大小就得初始化,数组的元素个数根据初始化的内容来确定

        1.3 一维数组的使用

        操作符: [] ,下标引用操作符。它就是数组访问的操作符,数组下标从0开始,数组大小可以通过计算得到。
 

int main()
{
    int arr[10] = { 0 };//数组不完全初始化
    //计算数组元素个数
    int sz = sizeof(arr) / sizeof(arr[0]);
    //对数组内容赋值,使用下标来访问的,下标从0开始
    int i = 0;
    for (i = 0; i < 10; i++)
    {
        arr[i] = i;
    }
    for (i = 0; i < 10; ++i)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

        1.4 一维数组在内存中的存储

int main()
{
        int arr[10] = {0};
        int i = 0;
        int sz = sizeof(arr)/sizeof(arr[0]);
        for(i=0; i<sz; ++i)
        {
                printf("&arr[%d] = %p\n", i, &arr[i]);
        }
        return 0;
}

        

         由结果可以看出,数组在内存中是连续存放的,下标从0到9,地址依次从低地址到高地址

二、二维数组的创建和初始化

        2.1 二维数组的创建

        int arr[3][4];

        char arr[3][5];
        double arr[2][4];

        2.2 二维数组的初始化

        int arr[3][4] = {1,2,3,4};
        int arr[3][4] = {{1,2},{4,5}};
        int arr[][4] = {{2,3},{4,5}};   //二维数组有初始化,行可以省略,列不能省略

        2.3 二维数组的使用

        使用二维数组也是通过下标的方式。

int main()
{
        int arr[3][4] = {0};
        int i = 0;
        for(i=0; i<3; i++)
        {
                int j = 0;
                for(j=0; j<4; j++)
                {
                        arr[i][j] = i*4+j;

                }
        }
        for(i=0; i<3; i++)
        {
                int j = 0;
                for(j=0; j<4; j++)
                {
                        printf("%d ", arr[i][j]);
                }
        }
        return 0;
}

        2.4 二维数组在内存中的存储

int main()
{
        int arr[3][4];
        int i = 0;
        for(i=0; i<3; i++)
        {
                int j = 0;
                for(j=0; j<4; j++)
                {
                        printf("&arr[%d][%d] = %p\n", i, j,&arr[i][j]);
                }
        }
        return 0;
}

        

         由结果可知,二维数组也是连续存放的。

三、数组越界 

        数组下标是有范围限制。数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1,数组的下标如果小于0,或者大于n-1,就说数组越界访问。

四、数组作为函数参数

        我们在写代码的时候,会将数组作为参数传给一个函数,比如:我要实现一个冒泡排序(这里要讲算法思想)函数。

         4.1 数组名

int main()
{
        int arr[10] = {1,2,3,4,5};
        printf("%p\n", arr);
        printf("%p\n", &arr[0]);
        printf("%d\n", *arr);
        return 0;
}

        

         由此可知:数组名是首元素地址,但有两个例外:

        1.sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数

        2.&数组名,取出的是数组的地址,数组名表示整个数组

        4.2 冒泡排序函数

        当数组传参的时候,实际上只是把数组的首元素的地址传递过去,即使在函数参数部分写成数组的形式: int arr[] 表示的依然是一个指针: int *arr,函数内部的 sizeof(arr) 结果是首元素的大小即4。

void bubble_sort(int arr[], int sz)//参数接收数组元素个数
{
    for (int i = 0; i < sz - 1; i++)
    {
        for (int j = 0; j < sz - i - 1; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                int tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
            }
        }
    }
}
int main()
{
    int arr[] = { 3,1,7,5,8,9,0,2,4,6 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    bubble_sort(arr, sz);
    for (int i = 0; i < sz; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/81655.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FreeSWITCH 1.10.10 简单图形化界面1 - docker/脚本/ISO镜像安装

FreeSWITCH 1.10.10 简单图形化界面1 - docker/脚本/ISO镜像安装 0. 界面预览1. Docker安装1.1 下载docker镜像1.2 启动docker镜像1.3 登录 2. 脚本安装2.1 下载2.2 安装2.3 登录2.4 卸载程序 3. 镜像安装3.1 下载镜像3.2 安装镜像3.3 登录 0. 界面预览 http://myfs.f3322.net…

SpringCloud学习笔记(六)_Ribbon服务调用

Ribbon介绍 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具 Ribbon是Netflix发布的开源项目&#xff0c;主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时、重试等。简单的说&#xff0c;就是…

HTML基础知识点

目录 ​编辑一、使用 vscode 二、研究代码的特点 三、HTML 常见标签 注释标签 标题标签 段落标签 换行标签 格式化标签 图片标签 超链接标签 表格标签 列表标签 表单标签&#xff1a; form 标签 input标签&#xff1a; select textarea标签&#xff1a; 无语…

机器学习深度学习——NLP实战(自然语言推断——微调BERT实现)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——针对序列级和词元级应用微调BERT &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文…

如何在 Opera 中启用DNS over HTTPS

DNS over HTTPS&#xff08;基于HTTPS的DNS&#xff09;是一种更安全的浏览方式&#xff0c;但大多数 Web 浏览器默认情况下不启用它。了解如何在 Opera 浏览器中启用该功能。 您可能不知道这一点&#xff0c;但您的网络浏览器并不像您希望的那样私密或安全。您会看到&#xff…

【BUG】解决安装oracle11g或12C中无法访问临时位置的问题

项目场景&#xff1a; 安装oracle时&#xff0c;到第二步出现oracle11g或12C中无法访问临时位置的问题。 解决方案&#xff1a; 针对客户端安装&#xff0c;在cmd中执行命令&#xff1a;前面加实际路径setup.exe -ignorePrereq -J"-Doracle.install.client.validate.cli…

CRYPTO 密码学-笔记

一、古典密码学 1.替换法&#xff1a;用固定的信息&#xff0c;将原文替换成密文 替换法的加密方式&#xff1a;一种是单表替换&#xff0c;另一种是多表替换 单表替换&#xff1a;原文和密文使用同一张表 abcde---》sfdgh 多表替换&#xff1a;有多涨表&#xff0c;原文和密文…

Python Opencv实践 - 图像直方图自适应均衡化

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/cat.jpg", cv.IMREAD_GRAYSCALE) print(img.shape)#整幅图像做普通的直方图均衡化 img_hist_equalized cv.equalizeHist(img)#图像直方图自适应均衡化 #1. 创…

四信5G工业路由器赋能5G LAN全连接工厂建设

5G作为“新基建”之首&#xff0c;肩负着驱动国民经济转型升级、促进实体经济与数字经济深度融合、满足各行各业高质量通信服务需求的重任。 随着5G技术的更新迭代&#xff0c;各行各业对网络的可靠性&#xff0c;确定性等提出更高的需求&#xff0c;5G LAN作为3GPP R16标准定…

3、Spring_容器执行

容器执行点 1.整合 druid 连接池 添加依赖 <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version> </dependency>1.硬编码方式整合 新建德鲁伊配置 <?xml version"1.…

【网络安全】跨站脚本(xss)攻击

跨站点脚本&#xff08;也称为 XSS&#xff09;是一种 Web 安全漏洞&#xff0c;允许攻击者破坏用户与易受攻击的应用程序的交互。它允许攻击者绕过同源策略&#xff0c;该策略旨在将不同的网站彼此隔离。跨站点脚本漏洞通常允许攻击者伪装成受害者用户&#xff0c;执行用户能够…

Linux C 多进程编程(面试考点)

嵌入式开发为什么要移植操作系统&#xff1f; 1.减小软硬件的耦合度&#xff0c;提高软件的移植性 2. 操作系统提供很多库和工具&#xff08;QT Open CV&#xff09;&#xff0c;提高开发效率 3.操作系统提供多任务机制&#xff0c;______________________? (提高C…