c语言学习笔记 —— 数组
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语言学习笔记 —— 数组的更多相关文章
- C语言学习笔记--数组指针和指针数组
C 语言中的数组有自己特定的类型,数组的类型由元素类型和数组大小共同决定.(如 int array[5]类型为 int[5]) 1.定义数组类型 C 语言中通过 typedef 为数组类型重命名:ty ...
- C语言学习笔记--数组参数和指针参数
1. 数组参数退化为指针的意义 (1)C 语言中只会以值拷贝的方式传递参数,当向函数传递数组时,将整个数组拷贝一份传入函数导致执行效率低下,C 语言以高效作是最初的设计目标,所以这种方法是不可取的. ...
- c语言学习笔记.数组.
数组: 可以存储一个固定大小的相同类型元素的顺序集合,比如int类型的数组.float类型的数组,里面存放的数据称为“元素”. 所有的数组都是由连续的内存位置组成.最低的地址对应第一个元素,最高的地址 ...
- GO 语言学习笔记--数组切片篇
1.对于make 数组切片,长度和容量需要理解清楚: 容量表示底层数组的大小,长度是你可以使用的大小: 容量的用处在哪?在与当你用 appen d扩展长度时,如果新的长度小于容量,不会更换底层数组,否 ...
- Go语言学习笔记八: 数组
Go语言学习笔记八: 数组 数组地球人都知道.所以只说说Go语言的特殊(奇葩)写法. 我一直在想一个人参与了两种语言的设计,但是最后两种语言的语法差异这么大.这是自己否定自己么,为什么不与之前统一一下 ...
- GO语言学习笔记(一)
GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...
- Go语言学习笔记十二: 范围(Range)
Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...
- Go语言学习笔记十一: 切片(slice)
Go语言学习笔记十一: 切片(slice) 切片这个概念我是从python语言中学到的,当时感觉这个东西真的比较好用.不像java语言写起来就比较繁琐.不过我觉得未来java语法也会支持的. 定义切片 ...
- Go语言学习笔记六: 循环语句
Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...
随机推荐
- Ngnix技术研究系列2-基于Redis实现动态路由
上篇博文我们写了个引子: Ngnix技术研究系列1-通过应用场景看Nginx的反向代理 发现了新大陆,OpenResty OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台 ...
- 51nod 1393 0和1相等串 思路 : map存前缀和
题目: 思路:把'0'当成数字-1,'1'当成数字1,求前缀和,用map更新当前前缀和最早出现的位置.(用map而不用数组是因为可能会出现负数) 当前缀和的值之前出现过,比如i = 10时,sum = ...
- ADALINE模型
ADALINE模型即自适应线性单元(Adaptive Linear Neuron),主要用于信号处理中的自适应滤波.预测和模式识别.其结构图如下 输入向量X=(x0,x1,x2,...,xn)T每个输 ...
- Python数据分析(二): Numpy技巧 (2/4)
numpy.pandas.matplotlib(+seaborn)是python数据分析/机器学习的基本工具. numpy的内容特别丰富,我这里只能介绍一下比较常见的方法和属性. 昨天晚上发了第一 ...
- Java面向对象 继承(上)
Java面向对象 继承 知识概要: (1)继承的概述 (2)继承的特点 (3)super关键字 (4)函数覆盖 (5) 子类的实例化过程 (6) final关键字 (1)继承 ...
- c# 【MVC】WebApi返回各种类型(图片/json数据/字符串)
using System.IO; /// <summary> /// WebApi返回图片 /// </summary> public HttpResponseMessage ...
- 如何在Windows系统中配置Mysql群集(Mysql Cluster)
MySQL群集技术在分布式系统中为MySQL数据提供了冗余特性,增强了安全性,使得单个MySQL服务器故障不会对系统产生巨大的负面效应,系统的稳定性得到保障. Mysql群集(Cluster)简介 M ...
- C#调用存储过程带输出参数或返回值
CREATE PROCEDURE [dbo].[GetNameById] @studentid varchar(8), @studentname nvarchar(50) OUTPUT AS BEGI ...
- asp.net数据四舍五入
#region 数据四舍五入 /// <summary> /// 四舍五入 /// </summary> /// <param name="dblnum&quo ...
- 批量下载验证码 shell
#!/bin/sh seq 0 699 | xargs -i wget http://www.5184.com/gk/common/checkcode.php -O img/{}.png