首页 > 其他分享 >C语言数组笔记

C语言数组笔记

时间:2024-07-20 14:40:10浏览次数:10  
标签:10 arr nums int 笔记 C语言 数组 长度

该笔记整理自 阮一峰老师的《C语言教程》和部分网上资料

声明和初始化数组

// 声明一个数组并初始化
int nums[] = {1, 2, 3, 4, 5};
// 完整写法: int nums[5] = {1, 2, 3, 4, 5};
// 数组长度可以省略,因为长度系统可以判断出来
// 声明一个长度为5的数组
int nums[5];
// 相当于 int nums[] = {0, 0, 0, 0, 0};
// 声明一个长度为5的数组,并指定部分位置的元素值
int nums[5] = {[2] = 10, 11};
// 相当于 int nums[] = {0, 0, 10, 11, 0};

当数组被声明后,数组的起始地址就被锁定了,就不能更改了

int nums[] = {1, 2, 3};
int nums01[3] = nums; // 报错,试图让nums01重新指向nums的空间
int nums[5]; // 相当于 int nums[] = {0, 0, 0, 0, 0};
nums = {1, 2, 3, 4, 5}; // 报错,试图让nums重新指向其他空间
int nums[10] = NULL; // 报错,尝试让nums重新指向NULL
int nums01[] = NULL; // 报错,nums01没有长度

获取数组长度

int nums[] = {1, 2, 3, 4, 5};
printf("%zd", sizeof(nums) / sizeof(int));
// 这里其实也可以让%d作占位符,但是为了防止溢出,建议使用%zd或%zu

数组指针

int nums[5];
int* numsp = nums; // 等同于 int* numsp = &nums[0];

数组名是一个指针,是指向其第一个元素的指针

int nums[] = {10, 2};
printf("%d", *nums); // 10
printf("%d", *(nums + 1)); // 20

注意,千万不要这么做

int nums[] = {10, 2};
nums ++;
// 相当于 nums = nums + 1; 即 让nums的第一个元素地址指向第二个元素地址

数组克隆

如果想让两个数组指向同一个空间

int nums[] = {1, 2, 3, 4};
int* numsCopied = nums;

如果想要两个相互独立的数组

int nums[] = {1, 2, 3, 4};
size_t numsLen = sizeof(nums) / sizeof(int);
int numsCopied[numsLen];
int i;
for (i = 0; i < numsLen; i ++) {
	numsCopied[i] = nums[i];
}

或者

include <stdio.h>
include <string.h>

int main() {
	int nums[] = {1, 2, 3, 4};
	int numsCopied[4];
	// memcpy参数分别为: 目标数组/指针,资源数组/指针,拷贝的字节数
	memcpy(numsCopied, nums, sizeof(nums));
}

多维数组

// 声明并初始化多维数组
int arr[][4] = {{1, 2, 3, 4}, {1, 2, 43, 4}};
// 此时,多维数组第一维的长度可以省略,但是其他维度的数组长度无法省略
int arr[3][4]; // 此时,任何维度的长度都不能省略

数组参数

当我们把一个数组作为形参时,应该再设置一个数组长度的形参
因为数组名就是指向其第一个元素的指针,如果单单传一个数组,那么函数只知道数组的起始地址,不知道数组的结束地址

void fn(int arr[5]) {}
// 这个写法合法,但是arr会被认成指针,arr数组的长度在函数内部也是无法获取的

// 正确的写法应该是
void fn(int arr[], int len) {}

如果形参数组为多维数组
第一维数组的长度可以通过其他参数传递
但是其他维度的长度需要写在中括号里

int sum(int arr[][5], int arrLen)

当数组字面量作为参数时,我们需要将字面量进行强转

fn((int []){1, 2, 3}, 3);

标签:10,arr,nums,int,笔记,C语言,数组,长度
From: https://www.cnblogs.com/LanceWorkstaion/p/18311366

相关文章

  • 学习笔记——路由
    文章目录VueRouter介绍作用说明路由配置VueRouter的使用步骤(5+2)五个基础步骤(固定)两个核心步骤router-link介绍使用好处声明式导航-两个类名介绍特点自定义高亮类名声明式导航-跳转传参介绍查询参数传递语法对应页面组件接收传递过来的值基于参数发请求动态路由传参......
  • C语言指针详解(进阶)
    二、指针的进阶    本章重点:            1.字符指针        2.数组指针        3.指针数组        4.数组传参和指针传参        5.函数指针        6.函数指针数组    ......
  • C语言之typedef,位运算
    typedef用typedef声明新的类型名来代替已有的类型名声明INTEGER为整型TypedefintINTEGER定义整形变量定义结构体定义数组定义字符型声明POINT为指向函数的指针类型,该函数返回整型值typedefint(*POINT)();用typedef可以声明各种类型名,但不能用来定义变量......
  • 苍穹外卖学习笔记——第十一天
    数据统计(图形报表)ApacheEChartsApacheECharts是一款基于Javascript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。官网地址:https://echarts.apache.org/zh/index.html。使用Echarts,重点在于研究当前图表所需的数据格式。通常是需要后端提供符合格式......
  • C++学习笔记
    第一章预备知识C++融合了三种不同的编程方式:过程性编程(C语言代表的)、面向对象编程(C语言基础上添加的类代表的)、泛型编程(C++模板支持)。Linux上源代码文件编译完后生成后缀.o的目标代码文件,然后执行链接后生成文件名为a.out(默认取名)的可执行程序。C++源文件名的后缀有.cpp......
  • [rCore学习笔记 016]实现应用程序
    写在前面本随笔是非常菜的菜鸡写的。如有问题请及时提出。可以联系:[email protected]:https://github.com/WindDevil(目前啥也没有设计方法了解了特权级机制,实际上如果要设计一个应用程序就需要保证它符合U模式的要求,不要去访问S模式下的功能,那么其实现要点是:应......
  • 深入理解与高效操作Python中的字节流(bytes)与字节数组(bytearray)
    深入理解与高效操作Python中的字节流(bytes)与字节数组(bytearray)在Python编程中,处理字节流(bytes)和字节数组(bytearray)是常见的需求,尤其是在处理网络通信、文件I/O、以及需要直接与硬件交互的场景中。理解这两种数据类型的特性及它们之间的区别,并掌握高效的操作方法,对于提升程......
  • FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
    ​《FFmpeg开发实战:从零基础到短视频上线》一书的“第11章 FFmpeg的桌面开发”介绍了如何在Windows环境对Qt结合FFmpeg实现桌面程序,那么Windows系统通过VisualStudio开发桌面程序也是很常见的,下面就介绍如何在VisualStudio的C++工程中集成FFmpeg库和SDL2库。首先按照《FFmpe......
  • 超详细的MySQL基本使用教程(1) 黑马程序员javaweb学习笔记+练习(附带idea新版ui图形化页
    什么是数据库MySQL概述数据模型关系型数据库SQL简介小结DDL-数据库的设计数据库的常见操作选中该语句然后点运行就成功运行了可以直接用图形化界面进行操作跳转到控制台表的常见操作1.创建练习在db01中创建这张表其中comment是鼠标悬停在......
  • PYTHON学习笔记(六、python数据结构--字典)
    (3)dict字典字典数据类型的含义是:根据一个信息查找另一个信息的方式构成了“键值对”,它表示索引用的键和对应的值构成对应的关系。1、字典的创建方式1)使用{ }直接创建字典使用{ }创建字典的语法结构如下:d={key1:value1,key2:value2......}例如:#使用{}创建字典d=......