首页 > 其他分享 >c语言--数组

c语言--数组

时间:2024-11-08 22:48:13浏览次数:3  
标签:初始化 arr 语言 -- int 数组 字符串 size

目录

1 数组创建

 1.1 定义定长数组

1.2 定义并初始化数组

1.3 定义部分初始化的数组

2. 动态数组(动态分配)

2.1 使用malloc动态创建数组

2.2 使用calloc动态创建数组

2.3 动态数组初始化

2.4 释放动态数组内存

3. 变长数组(VLA,Variable Length Array)

4.字符串和字符数组

4.1. 显式声明并初始化字符数组

4.2. 隐式声明并初始化字符数组:(声明字符串)

5.数组详解篇

5.1. 数组作为参数

5.2. 从函数返回数组

5.3指向数组的指针

6.数组长度计算


1 数组创建

数组是一个用于存储多个相同类型元素的数据结构。创建数组的方式有几种:

 1.1 定义定长数组

int arr[5];  // 创建一个长度为5的整数数组

1.2 定义并初始化数组

int arr[5] = {1, 2, 3, 4, 5};  // 创建并初始化数组

1.3 定义部分初始化的数组

如果数组的元素数量小于定义时的大小,未初始化的元素会默认赋值为0。

int arr[5] = {1, 2};  // 数组内容为 {1, 2, 0, 0, 0}

在 C 语言中,声明数组时如果数组的大小可以从初始化列表中推导出来,那么是可以不显式指定数组大小的。具体来说,数组的大小可以由编译器自动推断。

int arr[] = {1, 2, 3, 4, 5};

2. 动态数组(动态分配)

动态数组的大小在程序运行时才确定,通常通过malloccalloc等函数动态分配内存。

2.1 使用malloc动态创建数组

int* arr = (int*)malloc(5 * sizeof(int)); // 创建一个包含5个整数的动态数组

这里,malloc函数动态分配了一块内存,用于存储5个整数。

2.2 使用calloc动态创建数组

int* arr = (int*)calloc(5, sizeof(int)); // 创建并初始化为0的动态数组

malloc不同,calloc除了分配内存,还会将数组元素初始化为0。

2.3 动态数组初始化

for (int i = 0; i < 5; i++) { arr[i] = i + 1; // 初始化为 {1, 2, 3, 4, 5} }

2.4 释放动态数组内存

free(arr); // 释放动态数组内存

3. 变长数组(VLA,Variable Length Array)

变长数组是C99标准引入的特性,允许在运行时动态确定数组的大小(但局限于局部作用域中)。变长数组不像动态数组那样需要malloc

void function() {
    int n = 5;
    int arr[n];  // 创建一个大小为n的数组
    for (int i = 0; i < n; i++) {
        arr[i] = i + 1;  // 初始化数组
    }
}

这里,数组arr的大小是运行时由变量n决定的。

4.字符串和字符数组

字符串实际上是一个以 '\0' 结尾的字符数组,其中的每个元素都是一个字符。空字符(null character) '\0' 用来标记字符串的结束。字符串的末尾自动添加了这个空字符,所以字符串的实际长度是字符数加1(因为最后一个字符是空字符)。

4.1. 显式声明并初始化字符数组

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

4.2. 隐式声明并初始化字符数组:(声明字符串)

char greeting[] = "Hello";

重要说明:

char greeting[6]:这里显式地指定了数组的大小为6,正好是 "Hello" 字符串的5个字符再加上一个 '\0'

char greeting[]:在这种声明方式下,编译器会根据字符串的长度自动推断数组的大小,因此 greeting 数组的大小会是6。

5.数组详解篇

5.1. 数组作为参数

在C语言中,数组不能直接作为参数传递到函数中,实际上传递的是数组的指针。这意味着在函数内部修改数组的内容会影响原数组

#include <stdio.h>

void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    printArray(arr, 5);  // 将数组传递给函数
    return 0;
}

在这个例子中,printArray函数接受一个整数数组arr以及它的大小size作为参数。注意,数组arr在传递时实际上是通过指针传递的。arr 实际上是一个指向 arr[0] 的指针。

5.2. 从函数返回数组

C语言不允许直接返回一个数组(数组本身不能作为返回类型)。但可以通过返回指向数组的指针来实现返回数组的效果。通常,可以通过静态数组或者动态分配内存来实现。

#include <stdio.h>
#include <stdlib.h>

int* createArray(int size) {
    int* arr = (int*)malloc(size * sizeof(int));  // 动态分配内存
    for (int i = 0; i < size; i++) {
        arr[i] = i * i;  // 初始化数组
    }
    return arr;  // 返回指向数组的指针
}

int main() {
    int size = 5;
    int* arr = createArray(size);  // 接收返回的指针
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    free(arr);  // 记得释放内存
    return 0;
}

这里的 arr 不是一个普通的静态数组,而是一个指针,它通过 malloc 函数动态地分配了一块内存,大小为 size * sizeof(int),这意味着可以存放 sizeint 类型的元素。这个内存块实际上就是“数组”,但它并不是在栈上定义的,而是在堆上分配的。

5.3指向数组的指针

在C语言中,数组的名称可以看作是指向数组第一个元素的指针。通过这种方式,可以使用指针来访问数组中的元素。

#include <stdio.h>

int main() {
    int arr[3] = {1, 2, 3};
    int* p = arr;  // 指针p指向数组arr的第一个元素

    printf("%d\n", *p);  // 输出数组的第一个元素,结果是1
    printf("%d\n", *(p + 1));  // 输出数组的第二个元素,结果是2
    return 0;
}

6.数组长度计算

对于 静态数组(如 int arr[] = {1, 2, 3};),您可以使用 sizeof(arr) / sizeof(arr[0]) 来计算数组的长度。

对于 字符串(字符数组),可以使用 strlen() 来计算字符串的长度,这个长度不包括结束的空字符 \0

  • strlen(str) 返回的是字符串 str 的 字符数(不包括结束的 \0),而不是占用的字节数。
  • strlen() 会遍历字符串直到遇到 \0,然后返回遇到的字符数量。

标签:初始化,arr,语言,--,int,数组,字符串,size
From: https://blog.csdn.net/qq_63152518/article/details/143636058

相关文章

  • 每日OJ题_牛客_BC157素数回文_数学_C++_Java
    目录牛客_BC157素数回文_数学题目解析C++代码Java代码牛客_BC157素数回文_数学素数回文_牛客题霸_牛客网描述:现在给出一个素数,这个素数满足两点:1、  只由1-9组成,并且每个数只出现一次,如13,23,1289。2、  位数从高到低为递减或递增,如2459,87631。请你判断一下,这......
  • Ensp命令
    华为eNSP指令完全帮助shift+?sysname(修改名字)tracert(查看路由路径)system-view(进入系统视图)interfaceEthernet0/0/0(进入接口视图)ipaddressIP地址子网掩码(配置接口地址)displaythis(查看当前配置)iproute-static[目的网段][子网掩码][下一条地址](设置路由表)i......
  • 三层交换机及ensp配置详细教学
    三层交换机?三层交换机就是具有部分路由器功能的交换机,工作在OSI网络标准模型的第三层:网络层。三层交换机的最重要目的是加快大型局域网内部的数据交换,所具有的路由功能也是为这目的服务的,能够做到一次路由,多次转发。2实验拓扑2.1新建拓扑如下图 2.2pc机ip配置 Pc1pc2......
  • Ensp静态路由配置
    Ensp静态配置详解一、基本概念静态路由 是一种通过手动配置路由表来指导数据包转发的方式。在网络中,管理员需要手动添加路由条目,指定目标网络的下一跳地址。静态路由具有配置简单、资源消耗少、安全性高等优点,但也存在无法动态适应网络变化、维护困难等问题。 eNSP 是华......
  • JavaWeb --cookie和session技术
    Cookiecookie*客户端技术,存放在客户端,由服务器发放给用户保存*一个Cookie只能存放一个键值对Cookiecookie=newCookie(""(name),""(value));//设置cookie有效期单位秒//>0表示cookie有效期//=0删除cookie//<0会话cookiecookie.setMaxAge(0);//将cookie响应给客......
  • 【高等数学】微分学的应用
    中值定理罗尔中值定理fff在[a,......
  • Stack模块的设置
    TEAM:TopologicalEvolution-awareFrameworkforTrafficForecasting–ExtendedVersionMotivation为了捕捉复杂的时空动态,许多基于深度学习的方法最近被提出,并由于其学习非线性动力学[35,59]的能力,在挑战数据集上显示出了有希望的结果。这些方法通常建立在图神经网络(GNNs)[16......
  • huawei初级网络工程师综合实验
    本章为总结练习,只提供思路以及验证结果,和比较有难度的命令并且在我的其他章节对本练习中出现的所有都有介绍这里就不重复解释了拓扑图以及实验要求:sw1充当2层交换机sw-2(undoportswitch)充当三册交换机R-3连接外网1.基本ip配置略2.sw-2和R-2间开启rip协议R-2R-3......
  • 讲座の题解
    讲座配套题单的题解喵每题的文字解释会逐渐补充,如果有疑问直接私信喵目录讲座配套题单的题解喵目录A-看看你会不会用电脑B-求求你不要用内置函数C-GPAD-minE-for循环大神F-居然有人说这个是线性代数G-高三同学秒了H-无穷级数I-不要用内置函数......
  • 大数据新视界 -- 大数据大厂之 Impala 性能优化:融合机器学习的未来之路(上 (2-1))(11/30)
           ......