数据的批量解决——数组

前言

在处理大量的数据中,我们我经常会为繁琐的变量而感到头疼,这时候出现了数组这样的一个结构,他可以将相同的数据类型放到一段连续的地址中,并且可以通过下表去访问他们

数组的定义
int a[10]={0}     //定义一个空间为10的数组,并将他的数组清零

其中 int为数据类型,a为数组名称,【10】为申请的大小,d但要注意这个数字必须为整形,而不能为浮点型或者负数

数组的下标

数组是通过下标直接访问的,就用上面的为例子,因为数组是从0开始的,所以可以访问的有效下标是0~9

数组的地址

数组申请的地址是连续的,他的每一个成员相差的地址和他定义的数据类型有关,如果为int型他们直接就是相差4个字节,而如果是char类型,他们他们直接相差1个字节
同时也要注意数组的数组名可以代表数组的首地址
a =&a[0];

二维数组

1.【储存类型】 数据类型 标识符 【行下标】【列下标】
2.数组名的引用 数组名【行标】【列标】
3.储存形式 还是按照以每行为单位来线性存储

数组越界

数组的访问其实是通过地址访问的,所以当他出现越界的时候,系统是检测不出来的,但是一但出现数组越界的情况就会非常的危险,可能会修改其他文件的数据,所以数组越界就需要程序员自己来严防这个问题,要保证数值和范围不超过下标

数组和指针的关系

因为指针的本质就是地址,而数组的数组名也是地址,所以就有

a[i]=* (a+i);

在上面的三个等式中,如果我们用指针直接访问数组的话,效率是要高于通过下标访问数组

字符数组
char a[]="ni hao";
printf ("%s",a);

上面说的是一个简单的字符数组的创建和打印,我们可以发现,字符数组的打印只需要输入头地址就可以遍历整个数组的所有信息,,因为系统对字符串的的处理会自动加一直到遇见 ‘ \0 ’
补充:在c语言编辑器中,没有对字符串的处理,但是在所有的所有的字符串后面的会有的一个’\0’

对字符数组的大小的讨论
char str[128]="hellow";
char str2[128]={'h','e','l','o',''w}

对于以上的两个数组分别用string函数和sizeof函数比较

string 函数和sizeof 函数的讨论

由于srting函数是以判断是否到’\0’位标志结束的,所以可以得到第二个数组长度大于第一个。但同样要注意,用string函数的测第二个数组的时候会出现错误,因为他永远不会停止

在sizeof函数中,第一个是大于第二个的,因为第二个字符串后面有一个’\0’,所以要大于第二个

strcpy 函数和strncpy 函数的讨论

strcpy 是对字符串的一个操纵函数,可以将第二个的值拷贝到第一个里
char *strcpy(char *dest, const char *src);
但是他还是不检查越界的问题,当src的长度大于数组的长度的时候就会造成越界
这时候可以使用strncpy函数
char *strncpy(char *dest, const char *src, size_t n);
这个可以通过改变n 的大小来改变拷贝的多少,通常把n的大小设计为dest-1,这样保证了程序的稳定
当我们的设定的长度小于src的长度的时候,他会紧跟在上一个上面,可以看出他这个也是通过‘\0’来控制的。
执行这串代码,会发现没有到第二个的结尾,所以紧跟在其后面
在这里插入图片描述
在这里插入图片描述

精简版strcop 函数
while ((*pa++=*pb++) !='\0'

注意 数组的名是常量,不允许改变,比如a+=2这样的操作是违法的
同样的字符串常量也不允许改变,但是放在数组中可以改变

char *p="hellow";
p = 'a';     //非法
char p[128]="ni hao"
p[2]='s'  //合法

注意:当数组作为地址传入函数中的时候,数组会被理解为指针,这时候地址就可以修改
注意 用printf (str)来打印的数组的话,会造成字符格式化攻击,非常危险

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值