返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言 array数组的用法详解
  • 206
分享到

C语言 array数组的用法详解

2024-04-02 19:04:59 206人浏览 八月长安
摘要

目录一维数组的创建与初始化程序一:程序二:程序三程序四(二维数组 - 二维数组 的 列 绝对不能 省略 )二维数组在内存中的存储程序一数组作为函数参数,怎么作?实例:冒泡排序数组名:

一维数组的创建与初始化

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

程序一:


#include<stdio.h>
#include<string.h>
int main()
{
创建一个数组
int arr1[10];//  [常量]
初始化 int arr[10]={1,2,3};不完全初始化,剩下的元素默认初始化0.
char arr2[5];
初始化 char arr[5]={'a','b'};,不完全初始化,剩下元素默认初始化0.
初始化 char arr[5]="ab" 这是可行的,因为隐藏一个'\0',后面的0使我们自己给的(这个字符串都给给它的==),不是系统默认



int n = 5;
char ch[n]; 这样创建数组是错误,因为n还是变量,值是被赋值了,并不会改变它的属性
char arr3[5] = { 'a', 98 };//可行
上式等价于下式
char arr3[5] = {'a','b'}




char arr4[] = "abcd";//加上后面隐藏的'\0',大小为5
当我们并没有指定大小的时候,它会根据后面的数据,自己给定大小

    char  arr5[] = "abcdef";
    printf("%d\n",sizeof(arr5));// 7 sizeof晕倒'\0',把它算进去,在停止计算
    printf("%d\n", strlen(arr5));//6 strlen是遇到'\0'(不包含),就停止计算
    
    char arr6[] = { 'a', 'b','c','\0' };
    printf("%d\n",strlen(arr6));//如果没有'\0'结束标志符,它会一直算个数,直到遇到'\0',输出的是一个随机数
    printf("%d\n", sizeof(arr6));//没有'\0'它就少算一个就是3
    return 0;
}

程序二:


#include<stdio.h>
#include<string.h>
int main()
{
    char arr[] = "abcdef";//元素下标是从0开始
    pritnf("%c\n",arr[0]); //arr[0] == a,表示首元素a,输出结果为a

    如果要依次打印字符串所有元素用循环更简单,字符串的 '\0' 是隐藏的,一般是不用打印的
    int i = 0;
    int len = strlen(arr);// 计算元素个数
    for (i = 0; i < len; i++)
    {
        printf("%c ",arr[i]);// a b c d e f
    }

    return 0;
}

程序三


#include<stdio.h>
int main()
{
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    int sz = sizeof(arr) / sizeof(arr[0]);
    // sizeof(数组名)计算的整个数组的字节大小,我们只要再求一个元素的大小就可以了,因为 数组是一群相同类型数据的集合,所以我
    // 假设 int a[10]; 数组 a 有 10个 int(4byte) 类型的元素,整个数组的大小就是 4*10 == 40 byte, 数组大小除以数组元素大小,不就是数组元素个数嘛。(40/4 == 10)
    
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        printf("%d ",arr[i]);
        printf("&arr[%d]=%p\n",i,&arr[i]);// 打印 数组对应下标元素的地址
    }
    
    return 0;
}

程序四(二维数组 - 二维数组 的 列 绝对不能 省略 )


#include<stdio.h>
int main()
{
    ///int arr[3][4];//存储一个三行四列的数据 3是行(3个一维数组),4是列
int arr1[3][4] = {1,2,3,4,5};
假设 数据 是这样存的,在内存是连续存储的12345000.....
1234 
5000 
0000

int arr2[3][4] = {  { 1, 2, 3 } , { 4, 5 }   };
 1 2 3 0                      
 4 5 0 0
 0 0 0 0
一行的数据 是根据元素加个后面的{ },方便你们去区分,再根据列数确定 一行有多少个元素

 int arr3[][4] = { { 1, 2, 3 }, { 4, 5 } };
 1 2 3 0
 4 5 0 0
二维数组不管行还是列,下标都是从0开始,而且 二维数组的 行 是可以省略的,它会根据 元素 和 列的值,来确定行数

    int arr4[3][4] = { { 1, 2, 3 }, { 4, 5 } };
    int i = 0;
    for (i = 0; i < 3; i++)
    {
        int j = 0;
        for (j = 0; j < 4; j++)
        {
            printf("%d ",arr4[i][j]);1 2 3 0 
                                     4 5 0 0
                                     0 0 0 0
        }
        printf("\n");
    }
    return 0;
}

二维数组在内存中的存储

在内存中实际存储情况,第一行完了,第二行紧跟在第一行,第三行紧跟在第二行,int a[2][2]={1,2,3,4}, 在内存中存储情况为 1 2 3 4 (小端)
因为 数组的首元素地址是最小的,后面元素,地址依次增大(大约增大 一个元素的类型的字节大小)

程序一


#include<stdio.h>
int main()
{
    int arr[3][4] = { { 1, 2, 3 }, { 4, 5 } };
    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]);
            arr[0][3]和arr[1][0]地址相差4,二维数组与一维数组一样,都连续存储
        }
    }
    return 0;
}

在这里插入图片描述

数组作为函数参数,怎么作?

实例:冒泡排序


#include<stdio.h>
void bubble_sort(int arr[],int sz)
{
    
    确定冒号排序的趟数
    int i = 0;
    for (i = 0; i < sz - 1; i++)// 排序要排 元素总个数-1,最后一个元素不用排
    {
        int flag = 1;//假设这一趟的数据已经有序
       
        int j = 0;
        for (j = 0; j < sz-1-i; j++)//  每一趟冒号排序的过程
        {
            if (arr[j] > arr[j + 1])
            {
                int tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
                flag = 0;//本趟排序的数据不完全有序
            }
        }
        if (1 == flag)
        {
            break;
        }
    }
}
int main()
{
    int arr[] = { 0, 8, 7, 6, 5, 4, 3, 2, 1, 9 };
    int i = 0;
    int sz = sizeof(arr) / sizeof(arr[0]);
    bubble_sort(arr,sz);
    对数组arr进行传参,传递的是数组arr首元素的地址
    for (i = 0; i < sz; i++)
    {
        printf("%d ",arr[i]);//0,1,2,3,4,5,6,7,8,9
    }
    return 0;
}

数组名:


#include<stdio.h>
int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7 };//数组随着下标的增长,地址是由低到高变化点

	printf("%p\n",arr);
	数组名就是数组首元素地址,是一样的。见附图1
	printf("%p\n",&arr[0]);


	但有两个意外

	1.sizeof(数组名) - 数组名表示整个数组 ,计算的是整个数组的大小,单位为字节(byte)
	int sz = sizeof(arr); 
	printf("%d\n",sz);// 4(元素大小)* 7(元素个数)== 28,效果见附图 2


	2.&(数组名),数组名代表整个数组,&数组名,取的是整个数组的地址
	printf("%p\n", &arr);//表示数组的起始地址,是整个数组的地址
	上下两者的值一样,但 意义完全不同,效果图 见附图 3
	printf("%p\n", arr);//首元素的地址

    //进一步论证  &arr 和 arr的意义完全不同,不同在哪里
    printf("%p\n", &arr+1);//地址增加28字节,一个元素4byte,7个元素28字节,意味着 &arr + 1 跳过一整个数组的元素,指向最后一个元素后面的地址
    printf("%p\n", arr+1);//地址增加4字节,意味着 arr +1,跳过一个元素,改地址 arr+1,指向第二个元素
    效果见附图 4
    return 0;
}

关于数组名,有兴趣的,可以看看我这篇文章指针和数组试题解析(重置版)

附图1;

在这里插入图片描述

附图2:

在这里插入图片描述

附图3:

在这里插入图片描述

附图4:

在这里插入图片描述

本文结束

到此这篇关于C语言 array数组的用法详解的文章就介绍到这了,更多相关C语言 array数组内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言 array数组的用法详解

本文链接: https://lsjlt.com/news/155145.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言 array数组的用法详解
    目录一维数组的创建与初始化程序一:程序二:程序三程序四(二维数组 - 二维数组 的 列 绝对不能 省略 )二维数组在内存中的存储程序一数组作为函数参数,怎么作?实例:冒泡排序数组名:...
    99+
    2024-04-02
  • 详解C++语言中std::array的神奇用法
    目录概述自动推导数组大小用函数返回std::array编译期字面量数值合法性校验编译期生成数组截取子数组拼接多个数组编译期拼接字符串展望C++20——打破更多的枷锁尾注概述 std:...
    99+
    2024-04-02
  • GO语言的数组array与切片slice详解
    GO语言数组(array) 在GO语言中,数组是用于存储相同数据类型的集合,数组长度必须是一个常量表达式,且是一个非负数GO语言中的数组是一种值类型,下文会介绍 GO语言数组定义的格...
    99+
    2022-12-19
    GO语言的数组array GO语言切片slice GO语言数组定义赋值 GO语言多维数组 GO语言创建切片 GO语言复制与追加切片
  • C语言中数组的使用详解
    目录1 数组的基本概念2 数组定义语法3 一维数组的初始化3.1 全部初始化3.2 部分元素赋初值3.3 省略长度赋初值4 一维数组的使用示例4.1 求最大值、最小值、平均值4.2 ...
    99+
    2024-04-02
  • C语言详细讲解指针数组的用法
    目录1. 指针数组定义方法2. 指针的指针(二级指针)3. 字符串和指针4. 数组指针定义方法数组指针的用法1. 指针数组定义方法 格式: 类型说明符 *数组名[ 元素个数 ] in...
    99+
    2024-04-02
  • c语言的指针数组详解
    指针如何指向数组,并读取数组中的元素: #include <stdio.h> int main() { int arr[3] = {1,2,3}; int *p;...
    99+
    2024-04-02
  • C语言 柔性数组的使用详解
    目录一.柔性数组的特点二.柔性数组的使用1.如何使用柔性数组2.不用柔性数组的话有什么代替三.柔性数组的优势1.方便内存释放2.提高访问速度一.柔性数组的特点 struct S {...
    99+
    2024-04-02
  • C语言柔性数组详解
    目录前言一、柔性数组是什么?二、柔性数组的特点三、柔性数组的优点总结前言 可能大家第一眼看到这个标题会有点懵,到底什么是柔性数组,我怎么从来没听说过?但柔性数组确实是存在的,也经常会...
    99+
    2024-04-02
  • C语言动态数组详解
    目录内存分配函数malloc calloc realloc free内存操作函数 memset memcpy memmove二维动态数组的建立和释放总结内存分配函数malloc ca...
    99+
    2024-04-02
  • C语言中0数组\柔性数组的使用详解
    前言: 上次看到一篇面试分享,里面有个朋友说,面试官问了char[0] 相关问题,但是自己没有遇到过,就绕过了这个问题。 我自己在这篇文章下面做了一些回复。 现在我想结合我自己...
    99+
    2024-04-02
  • C++教程之array数组使用示例详解
    目录背景定义和初始化数组字符数组的定义理解复杂的数组声明指针与数组指针是迭代器指针的算术运算解引用和指针的算术运算下标与指针最后背景 上一篇文章我们介绍了C++中的迭代器,这篇文章...
    99+
    2023-03-08
    C++ array数组教程 C++ array
  • 关于JavaScript的Array数组方法详解
    目录数组的方法1. push() 添加2. pop() 删除4. shift() 删除7. splice() 删除8. concat() 连接9. join()10. re...
    99+
    2023-05-20
    JavaScript 数组 JavaScript Array
  • C语言字符串数组详解
    C语言字符串数组 字符串是连续的字符序列,最后以空字符'\0'作为终止符。一个字符串的长度指所有字符的数量,但不包括终止符。在 C 语言中,没有字符串类型,自然也就没有运算符以字符串...
    99+
    2024-04-02
  • C语言教程之数组详解
    目录1.一维数组的创建和初始化1.1数组的创建1.2数组的初始化1.3一维数组的使用1.4 一维数组在内存中的存储2.二维数组的创建和初始化2.1二维数组的创建2.2二维数组的初始化...
    99+
    2024-04-02
  • 详解C语言初阶之数组
    目录1.数组1.1数组的概念1.2数组的定义 a:完全初始化b:不完全初始化 c:给定元素个数d:不给定元素个数1.3数组的下标访问总结1.数组 1.1数组的概念 所谓数组...
    99+
    2024-04-02
  • 详解C语言之柔性数组
    目录定义特点具体使用例总结定义 可调整大小的数组 以0大小数组或无大小数组定义在结构体的最后一个元素中 特点 1.结构体中的柔性数组前必须包含至少一个其他成员。 2.sizeof...
    99+
    2024-04-02
  • C语言return的用法详解
    C语言return的用法有:1、对于返回值类型为void的函数,可以使用return语句来提前结束函数的执行;2、对于返回值类型不为void的函数,return语句的作用是将函数的执行结果返回给调用者;3、提前结束函数的执行,在函数内部,我...
    99+
    2023-10-22
    C语言 return
  • C语言 栈与数组的实现详解
    目录栈的实现栈的定义数组实现静态栈动态栈链栈栈的实现 首先我们思考一个问题,什么是栈? 栈是数据结构的一种,栈在我们日常编码中遇到的非常多,很多人对栈的接触可能仅仅局限在 递归使用的...
    99+
    2024-04-02
  • C语言指针数组案例详解
    指针与数组是 C 语言中很重要的两个概念,它们之间有着密切的关系,利用这种 关系,可以增强处理数组的灵活性,加快运行速度,本文着重讨论指针与数组之 间的联系及在编程中的应用。 1.指...
    99+
    2024-04-02
  • C语言 指针数组进阶详解
    目录指针与数组中的sizeof与strlensizeofstrlen数组名1、一维数组整型数组字符数组指针数组2、二维数组指针笔试题 笔试题1笔试题2笔试题3笔试题4笔试题...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作