1. 数组的内存分配原理。

数组定义  int a[3] = {1,3,11};

如下写法是错误的:

int number;

int a[number] = {1,7,9};

原因是:没有定长的数组初始化的时候,由于计算机不知道该分配多少空间给它,因此初始化会失败!

如下的写法虽然也可以运行,但是结果不是我们期望的。

int a[2] = {3,7};

int b[3] = {22,33,18};

b[3] = 99;

printf("b[3] is : %i\n", b[3]);  //这里输出的结果是什么? b只有3个元素,而我们这里输出第四个元素。结果输出还是 99

再来看

printf("a[0] is : %i\n", a[0]); //这里输出的结果是什么,猜猜看?

上面的输出结果我们发现a[3]变成了99,这是为什么呢?

因为数组作为一个变量在内存中也是从高到低存储的,但是数组元素却是按照从低到高排列在该数组所占的存储空间中。所以上面的b[3]挤占了 数组a中的第一个元素。如下图所示:

地址      数组变量     数组元素地址     数组元素值

0ffc19

0ffc20

0ffc21   数组b       b[0]                88

0ffc22                 b[1]                 33

0ffc23                 b[2]                  22

0ffc24   数组a       a[1]                 7(b[3]的修改导致这里被修改)

0ffc25                  a[0]                 3

2. 参数传递给形参为数组的函数的时候,传递的是数组的地址,因此数组的元素个数是可以省略的。

因此,主要是看形参

3. 数组作为形参会自动转换为指针,而指针在64位系统中占8个字节,也就是说无法在函数中通过传入的形参数组来计算数组的长度,必须将数组长度作为单独的参数进行传递。

例如

int a[] = {,,};
void printArray(arr[]){ int len = sizeof(arr[]) / sizeof(arr[]); for (int i = ; i < len; i ++){   printf("The nth eleme is : %i\n", arr[i]); } }

上面的代码打印后将无法输出正确的结果。 因为 sizeof(arr[])将永远等于8。

c语言学习笔记 —— 数组的更多相关文章

  1. C语言学习笔记--数组指针和指针数组

    C 语言中的数组有自己特定的类型,数组的类型由元素类型和数组大小共同决定.(如 int array[5]类型为 int[5]) 1.定义数组类型 C 语言中通过 typedef 为数组类型重命名:ty ...

  2. C语言学习笔记--数组参数和指针参数

    1. 数组参数退化为指针的意义 (1)C 语言中只会以值拷贝的方式传递参数,当向函数传递数组时,将整个数组拷贝一份传入函数导致执行效率低下,C 语言以高效作是最初的设计目标,所以这种方法是不可取的. ...

  3. c语言学习笔记.数组.

    数组: 可以存储一个固定大小的相同类型元素的顺序集合,比如int类型的数组.float类型的数组,里面存放的数据称为“元素”. 所有的数组都是由连续的内存位置组成.最低的地址对应第一个元素,最高的地址 ...

  4. GO 语言学习笔记--数组切片篇

    1.对于make 数组切片,长度和容量需要理解清楚: 容量表示底层数组的大小,长度是你可以使用的大小: 容量的用处在哪?在与当你用 appen d扩展长度时,如果新的长度小于容量,不会更换底层数组,否 ...

  5. Go语言学习笔记八: 数组

    Go语言学习笔记八: 数组 数组地球人都知道.所以只说说Go语言的特殊(奇葩)写法. 我一直在想一个人参与了两种语言的设计,但是最后两种语言的语法差异这么大.这是自己否定自己么,为什么不与之前统一一下 ...

  6. GO语言学习笔记(一)

    GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...

  7. Go语言学习笔记十二: 范围(Range)

    Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...

  8. Go语言学习笔记十一: 切片(slice)

    Go语言学习笔记十一: 切片(slice) 切片这个概念我是从python语言中学到的,当时感觉这个东西真的比较好用.不像java语言写起来就比较繁琐.不过我觉得未来java语法也会支持的. 定义切片 ...

  9. Go语言学习笔记六: 循环语句

    Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...

随机推荐

  1. PHP抓取网页图片

    <?php set_time_limit(0);//抓取不受时间限制 if($_POST['Submit']=="开始抓取"){ $URL=$_POST['link']; g ...

  2. SpringMVC加载.roperties文件属性值的方法?

    1.在xml文件中引入来获取属性值就不说了. 2.在controller层获取引用配置文件中的属性值: (1).编写工具类 @Configuration @PropertySource(value=& ...

  3. C# 如何添加Word文本和图片超链接

    超链接简单来讲就是内容链接,通过设置超链接可以实现对象与网页.站点之间的连接.链接目标可以是网页.图片.邮件地址.文件夹或者是应用程序.设置链接的对象可以是文本或者图片. 在以下内容中,我将介绍如何用 ...

  4. Weave Scope 容器地图 - 每天5分钟玩转 Docker 容器技术(80)

    Weave Scope 的最大特点是会自动生成一张 Docker 容器地图,让我们能够直观地理解.监控和控制容器.千言万语不及一张图,先感受一下. 下面开始实践 Weave Scope. 安装 执行如 ...

  5. ZOJ2401 Zipper 双塔式 DP

    遇到双塔DP,写一下. flag是为了避免memset多次导致的时间浪费. #include<cstdio> #include<cstdlib> #include<ios ...

  6. 第七章 DAO模式

    第七章 DAO模式 一.JDBC的封装 1.JDBC的封装: DAO位于业务逻辑和持久化数据之间,实现对持久化数据的访问.将数据库都封装起来,对外提供相应的接口 2.DAO模式的作用: 1.隔离业务逻 ...

  7. oracle11G r2 静默安装单实例(待优化版)

    测试环境:centos 6.9 X64 mini 版 oracle版本:11G r2 Oracle软件包:db_112040_Linux-x86-64_1of7.zip;db_112040_Linux ...

  8. Software development process

    一.Development process 1.Business/User Requirement 2.Architecture Proposal,Solution Proposal 3.Functi ...

  9. IntelliJ IDEA 2016.2激活

    激活码 43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lI ...

  10. Myeclipse10连接SqlServer2012

    本文纯手打!!!! 对于我们这些刚学java的小白,可是真费劲啊!!!! 要用java连接数据库  首先是要通过JDBC驱动 要先去下载一个sqljdbc4.jar,我这里放百度云盘了, 下载地址:链 ...