我记不住的那些编程语言的语法(数组)-1

news2024/12/24 3:12:37

背景:我记不住各种语言的语法,例如C、Java、Go、Python、JavaScript,大概就是常用的这几种语言,每种语言有其自己的语法规范,有的时候会记混了,所以想记录一下细节。这个系列会不定期的更新,本期是各类语言的数组。

一、C语言的数组

C语言的数组是非常重要的一种数据结构,下面是关于C语言数组的各种使用语法。

如果引用不存在的数组成员(即越界访问数组),并不会报错,所以必须非常小心。

/*
 *  C 语言数组
*/
int scores[100];

// 越界访问,不会报错,需要注意
scores[100] = 51;

// 可以用大括号赋值。
int a[5] = {22, 37, 3490, 18, 95};

// b[3]、b[4] 默认初始化为0
int b[5] = {32,58,123};

// 同时可以为指定位置的变量设置值,其余初始化为0
int c[15] = {[2] = 29, [9] = 7, [14] = 48};

// 省略数组的大小,由初始化的值自动计算大小,这时d的大小是3
int d[] = {22, 37, 3490};


// 数组的所占据的字节数,得出12个字节
int e[] = {22, 37, 3490};
int arrLen = sizeof(e); // 12


// 数组中的成员数目
sizeof(e)/sizeof(e[0])

// 多维数组
int board[10][10];

// 初始化
int a[2][5] = {
  {0, 1, 2, 3, 4},
  {5, 6, 7, 8, 9}
};

// 指定位置进行初始化
int a[2][2] = {[0][0] = 1, [1][1] = 2};

// 数组均是线性存储,也可以用一个大括号进行赋值操作
int a[2][2] = {1, 0, 0, 2};

// 变长数组,也就是数组大小不定,是一个变量,无法在编译期间确定,只在运行时候确定。
int i = 10;

int a1[i];
int a2[i + 5];

int m = 4;
int n = 5;
int c[m][n];

// 数组指针
// 数组名是一个指针,指向第一个元素的地址
int a[5] = {11, 22, 33, 44, 55};

int* p = &a[0];
// 等同于
int* p = a;

// a 与 &a[0] 是等价的, a是&a[0]的一种简写

// 可以将一个数组指针作为函数参数,传入到函数内部,在函数内部可以通过数组指针进行操作整个数组
// 这两种写法是一样的
// 写法一
int sum(int arr[], int len);
// 写法二
int sum(int* arr, int len);

// 二维数组 相当于 指针的指针
int a[4][2];

// 取出 a[0][0] 的值
*(a[0]);
// 等同于
**a

// 由于a[0]本身是一个指针,指向第二维数组的第一个成员a[0][0]。所以,*(a[0])取出的是a[0][0]的值。至于**a,就是对a进行两次*运算,第一次取出的是a[0],第二次取出的是a[0][0]。

// 通过指针的移动遍历数组,a + i的每轮循环每次都会指向下一个成员的地址,
// *(a + i)取出该地址的值,等同于a[i] 
// 对于数组的第一个成员, *(a + 0)(即*a)等同于a[0]

// 公式是  a[b] == *(a + b)

// 如果指针变量p指向数组的一个成员,那么p++就相当于指向下一个成员,这种方法常用来遍历数组
// 但容易出现数组越界的问题

int a[] = {11, 22, 33, 44, 55, 999};

int* p = a;

while (*p != 999) {
  printf("%d\n", *p);
  p++;
}

// 遍历数组一般都是通过数组长度的比较来实现,但也可以通过数组起始地址和结束地址的比较来实现
int sum(int* start, int* end) {
  int total = 0;
  while (start < end) {
    total += *start;
    start++;
  }
  return total;
}

int arr[5] = {20, 10, 5, 39, 4};
printf("%i\n", sum(arr, arr + 5));

// 二维数组指针的加减
int arr[4][2];

// 指针指向 arr[1]
arr + 1;

// 指针指向 arr[0][1]
arr[0] + 1


// 数组的复制
// 第一种方式是 循环进行赋值
// 第二种方式是 使用memcpy()函数

void *memcpy(void *dest, const void *src, size_t n)
// 将src的n个字节复制到dest中

char str1[] = "Geeks"; 
char str2[] = "Quiz"; 
 
puts("str1 before memcpy ");
puts(str1);
 
/* Copies contents of str2 to str1 */
memcpy (str1, str2, sizeof(str2));
 
puts("\nstr1 after memcpy ");
puts(str1);

// 数组作为函数的参数传入函数内部
int sum_array(int a[], int n) {
  // ...
}
int a[] = {3, 5, 7, 3};
int sum = sum_array(a, 4);


// 变长数组作为函数的参数,先写元素个数,再写元素地址
// 变量n作为参数时,顺序一定要在变长数组前面,这样运行时才能确定数组a[n]的长度,否则就会报错
int sum_array(int n, int a[n]) {
  // ...
}
int a[] = {3, 5, 7, 3};
int sum = sum_array(4, a);

//函数原型可以省略参数名,所以变长数组的原型中,可以使用*代替变量名,也可以省略变量名。
int sum_array(int, int [*]);
int sum_array(int, int []);

// 变长数组的写法
int sum_array(int n, int m, int a[n][m]);

// 还可以使用 数组字面量作为参数
int sum = sum_array((int []){2, 3, 4, 5}, 4);


// 字符串数组
// 在C语言中,字符串是一个字符型数组,而字符串数组是一个二维的字符型数组,每一个字符串由\0结尾
// 语法为:
// char var_name[r][c] = {list of string};

// var_name是一个变量名
// r是字符串的个数的最大值, c是每个字符串存储的最大的字符数

char arr[3][10] = {"Geek","Geeks", "Geekfor"};
3代表3个字符串,10代表每个字符串的最大字符数。

关于字符串数组,

char arr[3][10] = {"Geek","Geeks", "Geekfor"};

会导致浪费内存空间,并且无法修改,

arr[0] = "china"  // 这样会报错,因为arr[0]指向的是一个地址, 

但是可以通过

strcpy(arr[0],"china")  // 这样将会把字符串"china"拷贝到arr[0]上
为了节省空间,我们可以使用指针数组,是一个一维的数组,里面存储的是指针

优点: 1. 可以任意修改各个字符串    2. 还不会浪费内存空间

char* arr[] = {"Geek","Geeks","Geekfor"};

arr[1] = "china";   // 这样可以修改

二、Java语言的数组

Java语言的数组和C语言数组语法不一样,但都是指针,只不过在Java,都是通过指向内存地址来进行访问,这里记录一下。

// 数组类型 : “类型[]” 这是一种类型
// 数组在初始化的时候必须使用 new 类型[n]来进行初始化
// Java的数组有几个特点:

// 第一: 数组所有元素初始化为默认值,整型都是0,浮点型是0.0,布尔型是false;
// 第二: 数组一旦创建后,大小就不可改变。
// 第三: 要访问数组中的某一个元素,需要使用索引。数组索引从0开始,
// 第四: 数组如果索引超出范围会报错,而C语言不会报错,这是Java和C语言的不同

int[] ns = new int[5];

// 数组长度通过数组的length属性来获取
ns.length

// 定义数组时直接指定初始化的元素,这样就不必写出数组大小,而是由编译器自动推算数组大小,和C语言是一致的。

int[] ns = new int[] { 68, 79, 91, 85, 62 };
或者 简写为
int[] ns = { 68, 79, 91, 85, 62 };   // 与C语言相似,只是数组类型的写法不一样。

// Java数组也是引用类型,可以理解为和C语言是一致的
// 字符串数组
String[] names = {"ABC", "XYZ", "zoo"};
String[] s = names;
names[1] = "cat";
System.out.println(names[1]);    // cat
System.out.println(s[1]);        // cat

// "ABC"、"XYZ"和"zoo"是三个字符串变量,存在于内存中的不同的地址
// names[0]是一个字符串指针,指向了内存中”ABC“的地址
// names[1]是一个字符串指针,指向了内存中"XYZ"的地址
// names[2]是一个字符串指针,指向了内存中"zoo"的地址
// names也是一个指针指向初始的地址,即指向 names[0]
// 所以在names数组中 是存放各个字符串的指针,与C语言的指针数组是一样的
// 指针数组: 存放若干指针的数组。

// 当修改某个字符串时候,其实是改变了指针的指向。
names[1] = "cat";   // 首先在内存中新建一个"cat",然后将names[1]指向"cat"的地址

三、Go、Python、JavaScript

关于Go/Python/JavaScript的相关知识,后续补充,敬请期待

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一路坎坷,入局到突破【2022年度总结】

秃秃 1> 来到CSDN&#xff1a; 2019年5月时决定只身一人去外省实习&#xff0c;顺便在CSDN这个“资源库”注册了一下账号。直到我20年在公司做技术分享时&#xff0c;才真正开始在CSDN上的创作&#xff1b; 21年的时候也只是把CSDN当做笔记&#xff0c;就自己写一写&…

行业洞察|猴子可以打字,动物走进元宇宙还有多远?

很多学者和专家认为&#xff0c;人类与动物的区别在于语言的使用。人类可以使用语言&#xff0c;但是动物不会。其实也许是我们人类听不懂动物的语言&#xff0c;并不是他们不会使用。本质在于沟通的媒介不同&#xff0c;导致我们无法相互交流。但是&#xff0c;埃隆马斯克&…

App原型设计规范

一、界面尺寸 1.ios分辨率 2.android界面尺寸 ① 安卓分辨率 ②常见安卓手机分辨率及尺寸 一般情况下大家在设计app端原型的时候&#xff0c;由于现在ios和安卓慢慢在趋向一致&#xff0c;所以基本上都只会设计一套原型&#xff0c;尺寸方面一般都是按照iphone6的750*1344(2倍…

Django 数据备份dumpdata 踩的坑

项目背景&#xff1a; 项目使用的是sqlite数据库&#xff0c;要求备份除了网络表之外的所有数据 实施方案&#xff1a; python3 manage.py dumpdata --exclude network.TRoute --indent 2 --format json > aq3.json 方案操作结果是&#xff1a; 查看aq3.json如下&#xff…

一文详解GCC7、CUDA 11.2、CUDNN部署

在部署之前&#xff0c;需要了解下python-tensorflow-cuDNN-CUDA版本对应关系,以便能够完全兼容下文以此版本为例部署gcc-7.3.1gpu driver-460.106.00cuda-11.2cudnn-8.1.1一.gcc部署1.安装[rootgpu ~]# yum -y install centos-release-scl [rootgpu ~]# yum install devtoolse…

《收获,不止Oracle》索引细化

1.索引知识图框 2.索引探秘 2.1 BTREE索引 索引是建在表的具体列上的&#xff0c;其存在的目的是让表的查询变得更快&#xff0c;效率更高。表记录丢失关乎生死&#xff0c;而索引丢失只需重建即可。 索引却是数据库学习中最实用的技术之一。谁能深刻地理解和掌握索引的知识&…

Spring gateway websocket自定义负载均衡

业务需求 公司IM服务主要基于netty实现websocket&#xff0c;为保证在线用户channel通道畅通故一直使用单机运行。现由于公司业务增加需要增加IM集群&#xff0c;由于channel通道不能缓存&#xff0c;故急需一套可以完整兼容之前功能的方案。 技术选型 1、采用spring websocke…

Bonree ONE荣获信通院“2022IT新治理年度明星产品”

今日&#xff0c;由信通院主办的“GOLFIT新治理领导力论坛”正式召开&#xff0c;论坛上公布了2022IT新治理年度评选活动的结果&#xff0c;博睿数据一体化智能可观测平台Bonree ONE凭借卓越的产品力以及优秀的用户体验&#xff0c;从一众产品中脱颖而出&#xff0c;获得“2022…

spring 事务@Transantional 失效及解决方案和总结

1、线程中方法&#xff0c;事务会失效 2、线程中方法&#xff0c;事务会失效。即使在线程方法上增加Transactional注解 3、事务正常回滚&#xff0c;A方法调用B的普通方法 4、事务正常回滚。A方法调用B的private普通方法 6、会抛出NullPointerException异常。 Methods ann…

rock3a: 基于自建数据集+yolov5s模型的rknn模型训练部署全流程

上一篇文章其实已经详述了模型训练到部署的整个流程&#xff0c;但是数据集到模型都是用的官方的coco数据集&#xff0c;这里为了记录开发板的模型训练到部署的整个流程&#xff0c;重新开了一篇文章进行记录。 首先准备数据集和rockchip官方推荐的yolov5源代码 这里需要注意的…

基于Node.js Vue企业产品展示网站

摘 要随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&am…

CAN201-Computer Network(2)

文章目录4. Network Layer4.1 Router4.1.1 Input port functions4.1.2 Destination-based forwarding4.1.3 Switching fabrics4.1.4 Input port queueing4.1.5 Output ports4.2 Internet Protocol4.2.1 IP fragmentation, reassembly4.3 IPv4 addressing4.3.1 Subnets4.3.2 Net…

高等数学(第七版)同济大学 习题11-4 个人解答

高等数学&#xff08;第七版&#xff09;同济大学 习题11-4 函数作图软件&#xff1a;Mathematica 1.设有一分布着质量的曲面Σ&#xff0c;在点(x,y,z)处它的面密度为μ(x,y,z)&#xff0c;用对面积的曲面积分表示这曲面对于x轴的转动惯量.\begin{aligned}&1. \ 设有一分…

IB生物课程介绍与Topic 1: Cell Biology考点分享

准备让孩子就读国际学校或者孩子正在国际学校就读的家长肯定听说过“IB”或者“IB班”&#xff0c;那IB究竟是什么呢&#xff1f;IB与IB课程 IB是International Baccalaureate&#xff08;国际文凭&#xff09;的简称&#xff0c;其课程体系国际文凭大学预科课程&#xff08;In…

Educational Codeforces Round 141 (Rated for Div. 2)A——C

ps&#xff1a;先自我检讨...自从世界杯开始后&#xff0c;就一直摆烂到现在。直到打了今年的第一场cf&#xff0c;看见打的这么菜&#xff0c;真是想remake/。后面我会陆陆续续的补完前段时间没有打的比赛... Dashboard - Educational Codeforces Round 141 (Rated for Div. …

ReentrantLock

目录 ReentrantLock ReentrantLock语法 ReentrantLock可重入 ReentrantLock可打断 ReentrantLock锁超时 ReentrantLock解决哲学家就餐问题 ReentrantLock公平锁 ReentrantLock条件变量 ReentrantLock ReentrantLock 相比于synchronized的特点 : 可中断:比如A线程拥有…

基于移动最小二乘法的曲线曲面拟合论文阅读笔记

基于移动最小二乘法的曲线曲面拟合论文阅读笔记 论文地址:http://www.cnki.com.cn/Article/CJFDTotal-GCTX200401016.htm 一、Problem Statement 传统的曲线(曲面)拟合方法一般使用最小二乘法&#xff0c; 通过使误差的平方和最小&#xff0c; 得到一个线性方程组&#xff0…

通过alist挂在阿里网盘的方法

1、在github官网https://github.com/alist-org/alist/releases/download/v3.8.0/alist-windows-amd64.zip下载alist软件客户端&#xff0c;双击运行&#xff0c;可以看到默认的密码和服务器地址&#xff0c;打开网页http://localhost:5244/manage/accounts&#xff0c;填写密码…

【Linux】Linux工具

文章目录软件包管理器yumVIM编辑器Linux编译器-gcc/g使用gcc如何完成预处理(进行宏替换)编译(生成汇编)汇编(生成机器课识别代码)链接在这里涉及到一个重要的概念: 函数库函数库一般分为静态库和动态库两种gcc选项gcc选项记忆Linux项目自动化构建工具-make/Makefile背景理解实例…

解决vue中报错 Duplicate keys detected:‘1‘. This may cause an update error.

报错截图&#xff1a; 报错原因&#xff1a; 通过上图的报错信息我们不难看出&#xff0c;报错的主要原因出现在 key 值上&#xff0c;报错的意思大概是检测到重复的 key 值&#xff0c;通俗来讲就是你的 key 值不是唯一的。 解决方案&#xff1a; 问题的根源找到了&#xff…