C语言 array数组的用法详解

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

一维数组的创建与初始化

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

程序一:

#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/*b的ASCII码等于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数组内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅谈mwArray和一般数组的区别

    可以用下面的代码详细理解mwArray和一般数组之间的区别 mwArray a(3, 2, mxDOUBLE_CLASS); double *aData; aData = new double[6]; int iii; for( iii=0; iii<6; ++iii) { aData[iii] = iii+1; } // print output std::cout << "a = " << std::endl; std::cout << a

  • C++中rapidjson组装map和数组array的代码示例

    rapidjson组装map和数组array的代码示例 直接上码: #include <iostream> #include <map> // 请自己下载开源的rapidjson #include "rapidjson/prettywriter.h" #include "rapidjson/rapidjson.h" #include "rapidjson/document.h" #include "rapidjs

  • C语言 array数组的用法详解

    目录 一维数组的创建与初始化 程序一: 程序二: 程序三 程序四(二维数组 - 二维数组 的 列 绝对不能 省略 ) 二维数组在内存中的存储 程序一 数组作为函数参数,怎么作? 实例:冒泡排序 数组名: 一维数组的创建与初始化 数组是一种相同类型元素的集合 程序一: #include<stdio.h> #include<string.h> int main() { 创建一个数组 int arr1[10];// [常量] 初始化 int arr[10]={1,2,3};不完全初始化,

  • Go语言学习之数组的用法详解

    目录 引言 一.数组的定义 1. 语法 2. 示例 二.数组的初始化 1. 未初始化的数组 2. 使用初始化列表 3. 省略数组长度 4. 指定索引值的方式来初始化 5. 访问数组元素 6. 根据数组长度遍历数组 三. 访问数组元素 1. 访问数组元素 2. 根据数组长度遍历数组 四.冒泡排序 五.多维数组 1. 二维数组 2. 初始化二维数组 3. 访问二维数组 六.向函数传递数组 1. 形参设定数组大小 2. 形参未设定数组大小 3. 示例 总结 引言 数组是相同数据类型的一组数据的集合,数

  • C语言const关键字的用法详解

    目录 1 介绍 1.1 const修饰变量 1.2 const修饰数组 1.3 const修饰指针 1.4 const修饰函数参数 2 const对程序的影响 3 总结 1 介绍 const关键字是constant的缩写,翻译为常量.常数.在C语言中const的作用很强大,它可以修饰变量.数组.指针.函数参数等. 1.1 const修饰变量 const修饰变量,表示希望此变量具有只读性,防止被直接直接修改. //const关键字是constant的缩写,翻译为常量.常数. //在C语言中cons

  • C语言之strtol函数用法详解

    strtol 函数用法 strtol是一个C语言函数,作用就是将一个字符串转换为长整型long,其函数原型为: long int strtol (const char* str, char** endptr, int base); 下面我们来看下每个参数的意义: str是要转换的字符 enptr是指向第一个不可转换的字符位置的指针 base的基数,表示转换成为几进制的数 两点注意: 当 base 的值为 0 时,默认采用 10 进制转换,但如果遇到 '0x' / '0X' 前置字符则会使用 16

  • C语言 柔性数组的使用详解

    目录 一.柔性数组的特点 二.柔性数组的使用 1.如何使用柔性数组 2.不用柔性数组的话有什么代替 三.柔性数组的优势 1.方便内存释放 2.提高访问速度 一.柔性数组的特点 struct S { int x; int a[]; }; int main() { printf("%d", sizeof(S)); } 这段代码的输出是什么? 我们打印结构体S所占空间的大小,这个a[]占多少字节呢? 输出结果是4,可一个int类型的x就是4了,a[]去哪了?好奇怪哦. 原来,这是一种柔性数组

  • Go语言学习之WaitGroup用法详解

    目录 前言 小试牛刀 总览 底层实现 结构体 Add Done Wait 易错点 总结 前言 在前面的文章中,我们使用过 WaitGroup 进行任务编排,Go语言中的 WaitGroup 和 Java 中的 CyclicBarrier.CountDownLatch 非常类似.比如我们有一个主任务在执行,执行到某一点时需要并行执行三个子任务,并且需要等到三个子任务都执行完后,再继续执行主任务.那我们就需要设置一个检查点,使主任务一直阻塞在这,等三个子任务执行完后再放行. 说明:本文中的示例,均是

  • Python当中的array数组对象实例详解

    计算机为数组分配一段连续的内存,从而支持对数组随机访问: 由于项的地址在编号上是连续的,数组某一项的地址可以通过将两个值相加得出,即将数组的基本地址和项的偏移地址相加. 数组的基本地址就是数组的第一项的机器地址.一个项的偏移地址就等于它的索引乘以数组的一个项所需要的内存单元数目的一个常量表示(在python中,这个值总是1) import array #array模块是python中实现的一种高效的数组存储类型.它和list相似,但是所有的数组成员必须是同一种类型,在创建数组的时候,就确定了数组

  • 关于C语言一维数组算法问题详解

    目录 问题1:将数组中的数逆序存放 问题2:求数组中最大值及其下标 问题3:找出不是两个数组的共有元素 问题4:找出出现次数最多的数 问题5:数组中插入数字并排序 问题6:数组循环右移问题 总结 问题1:将数组中的数逆序存放 本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放, 再按顺序输出数组中的元素. 算法描述:1.向数组a中输入元素: 2.定义一个新数组new,将数组a中的元素倒序存放: 3.将数组b正序输出,注意结尾无空格的格式问题. 代码实现 : #include

  • Go语言的type func()用法详解

    目录 一.前置基础 1. go 函数基础 2. 函数签名 二.Go语言的type func()用法 | type func() 自定义函数类型 1. golang通过type定义函数类型 一.前置基础 1. go 函数基础 在Go语言中,函数的基本组成为:关键字func.函数名.参数列表.返回值.函数体和返回语句. func 函数名(参数列表) 返回值类型 {函数体内部} Go语言是强数据类型的语言,参数是要指定类型的不然就报错.func 是函数的声明关键字. 1) 返回值返回值的定义,是可以给

  • 基于PHP array数组的教程详解

    定义数组数组array是一组有序的变量,其中每个变量被叫做一个元素.一.定义数组 可以用 array() 语言结构来新建一个数组.它接受一定数量用逗号分隔的 key => value 参数对. array( [key =>] value , ... ) // key 可以是 数字 或者 字符串 // value 可以是任何值 例子1: 复制代码 代码如下: <?php $phpjc = array( =>'word', =>'excel', 'outlook', 'acces

随机推荐