首页 > 其他分享 >数组基础(day11)

数组基础(day11)

时间:2022-11-11 18:09:34浏览次数:43  
标签:arr 字节 int 基础 数组名 day11 数组 printf

笔者曾学过一阵labview,在labview中,首先创建空的数组框,随后将int整型,或str字符串型变量放入数组框内,就实现了数组的生成。

1.字符串型数组

labview与c的逻辑很相似。但在c语言中,很少有处理字符串类型的函数,c语言实际上是将字符串拆成单个字符,然后将单个字符连续储存在数组向内存申请的字节内。

我们来看一串代码

char arr1[] = { 'a','b','c' };
char arr2[20] = "abc";

同样是保存字符串信息”abc“,两者采取了不同的方式实现分别储存单独字符的功能

第一行代码是声明一个char型数组,该数组向内存申请的储存字节的多少根据右侧元素的多少决定。显然三个字符元素需要三个字符储存空间即3个字节。

第二行是代码同样是声明一个要求20个字节空间的char型数组,但是我们直接向该数组赋值字符串”abc“,编译器在读取字符串的双引号时,会自动在末尾添加元素\0,所以实际上,我们占用了申请的二十个字节中的前四个字节。

我们用一个□表示一个字节,实际存储情况如下:

a  b  c
□ □ □
a  b  c \0
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □

我们在用sizeof()操作符时,会读取该数组向内存申请的储存空间。

执行以下打印代码

printf("%d\n", sizeof(arr1));
printf("%d\n\n", strlen(arr1));//考虑一下为什么是随机值。
printf("%d\n", sizeof(arr2));
printf("%d\n\n", strlen(arr2));

显然,结果为

3
随机值
20
3

为什么在使用strlen()函数时第一种数组赋值方法会出现?

我们知道,strlen是通过在读到\0后,返回遍历\0前面所有字符的个数(不含\0)。第二种的返回值为3是因为编译器会主动在“”之间加上\0,而第一种赋值方法因为字节内没有\0字符的存在,该函数会一直执行直到遇到\0字符。


2.整型数组

这里先阐明一下什么是数组名。我们来考虑如下问题:

当我们设置如下一个数组时,数组名指的什么?

int arr1[] = {1,2,3}

这里直接给出答案。数组名是一种特殊的数据结构,这种结构会体现两方面的性质。

1)指针性质。当涉及函数传参,或者函数打印时,数组名体现的是指针性质。指针指向第一个数组元素。

printf("%p\n", &arr1);
printf("%p\n", arr1);

结果均为数组元素1的储存地址。

但那就确定数组名就是指针吗?我们再看下面一段代码:

printf("%d\n", sizeof(arr1));

如果arr1是指针,指针占用的内存在64位系统中与int型一致,为4个字节,那这串代码打印的是4吗?并不是。其结果为12,显然为数组内元素个数为3,每个元素占用字节为4,12 = 3*4,而在此时,数组名体现的又是整个数组的某种性质。为什么会有这种差异?

作为一个初学者,笔者认为这种差异实际上是操作符和函数的差异。sizeof作为操作符,它处理数组时是很贴近数组实质的(一串连续地址储存数组元素),所以用操作符操作数组就会体现出处整个数组的特性。

而函数是较外层的处理数组的操作方式,数组名作为一个体现数组性质的数据结构,在被外层的函数调用时,它的某些整体性质丢失了,剩下的只有指针性质。这可能是因为数组名所代指的数组是个极其占用内存的东西,如果函数接收到的是整个数组的性质,那函数会向内存申请相当大的空间造成空间的浪费和代码效率下降。

既然如此,我使用数组名的指针性质,即如果我能找到第一个元素,那我就能找到数组的所有元素。这样就能解决上述问题。当然代价就是数组名丢失了一些整体性质,功能变得单一化了。

解决了上述数组名的问题,我们来看一个冒泡排序函数的编写。

实例

void bubble_sort(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
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;
}
}

}

}

int main()
{
int arr[] = { 2,8,9,4,5,3,1,7 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
for (i = 0; i <= sz; i++)
{
printf("%d", arr[i]);
}
return 0;
}

执行逻辑省略了。。。做核酸去了


标签:arr,字节,int,基础,数组名,day11,数组,printf
From: https://blog.51cto.com/u_15862591/5845213

相关文章

  • javascript基础算法之数组元素两两相加等于某个固定值,并得出它们的对数
      letarr=[1,2,6,6,7,8,11,12,13,4,4]letnum=12functionsolution(arr,target){console.log('给出指定数组--->',arr)console.log('给出指定数......
  • javascript基础算法之判断一个随机整数是否为质数
    质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;functionsolution(num){if(num<=1){return'数据错......
  • 223201062522刘晋-软件工程基础Y- 实验二 结对项目报告
    沈阳航空航天大学软件工程基础实验报告实验名称:实验二实验题目:结对项目专业软件工程学号223201062522姓名刘晋结对伙伴赵德龙指导教师孟桂英......
  • 什么是 PKI? 公钥基础设施的定义和指南
    ​ 公钥基础设施(PKI)管理Internet通信中的身份和安全性,以保护人员、设备和数据。组织依靠PKI解决方案来验证和加密流经Web服务器、数字身份、连接设备和应用程......
  • MySql - 基础学习 - JDBC
    一.为什么要学习JDBCSUM公司为了简化开发人员的操作(对数据库的统一),提供了一个规范(Java操作数据库的规范),俗称:JDBC这些规范的实现是由厂商们去做~对于开发人员来说,我们只......
  • 数组-滑动窗口(直接套模板完事儿)
    前言兄弟们,互联网寒冬期,算法刷着走。上篇文章讲了双指针的左右指针,双指针是数组类算法题中最重要的一个分支之一。这篇文章讲双指针技巧的滑动窗口。遇到双指针的题目,直接......
  • 软件工程基础实验二
    1.任务要求本次作业要求两个人合作完成,驾驶员和导航员角色自定,鼓励大家在工作期间角色随时互换,这里会布置两个题目,请各组成员根据自己的爱好任选一题。2.题目我们在刚开......
  • React框架学习基础篇-HelloReact-01
    一直想掌握一门前端技术,于是想跟着张天宇老师学习,便开始学习React,以此来记录一下我的学习之旅。学习一门新的技术首先是去官网看看,React官网链接是[https://zh-hans.react......
  • 基于OpenJDK Alpine制作日常java基础镜像
    Dockerfile内容如下:FROMeclipse-temurin:8-jre-alpineMAINTAINERdevops([email protected])RUNapkupdate&&apk--no-cacheaddtzdatattf-dejavufontconfig......
  • 【BIM】BIMFACE基础开发流程
    1.相关概念accesstoken:bimface后端接口访问凭证,通过appkey和appsecret获取,其有效期为一周viewtoken:bimface模型临时访问凭证,其有效期为12小时fileId:单个revit或其他模......