C语言学习入门 (三) sizeof 函数、内存地址、数组

sizeof可以用来计算一个变量或者一个常量、一种数据类型所占的内存字节数。

sizeof(10);

char c = ‘a‘;

sizeof(c);

sizeof(float);

地址

1.计算机中的内存是以字节为单位的存储空间。内存的每一个字节都有一个唯一的编号,这个编号就称为地址。

凡存放在内存中的程序和数据都有一个地址,也就是说,一个函数也有自己的内存地址

2.  当定义一个变量时,系统就分配一个带有唯一地址的存储单元来存储这个变量。比如:

char a = ‘A‘;// A的ASCII值为65

int b[] = {66,33};

在16bit编译器环境下,系统为a、b分别分配1个字节、2个字节的存储单元。变量存储单元的第一个字节的地址就是该变量的地址。

可以看出,变量a的地址是ffc3;变量b的地址是ffc1。内存中存储的都是2进制数据

一维数组

定义的形式为:类型  数组名[元素个数]

int a[5];

int [] a; 这样写是错的 不同于java写在变量名前后都行  且定义时需要指定元素个数

初始化:

int a[2] = {8,10};

其实相当于:

int a[2];

a[0] = 8;

a[1] = 10;

元素值列表可以是数组所有元素的初值,也可以是前面部分元素的初值

int a[4] = {2,5};  这样就赋值给a[0]=2;a[1]=5; 
a[2]=a[3]=默认值0

当定义并直接初始化时 可以不指定元素个数

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

数组初始化时的赋值方式只能用于数组的定义,定义之后只能一个元素一个元素地赋值

int a[3];

a = {1,2,3};//错误。 
因为 数组名a 代表变量的地址,是个常量,给常量赋值就错了

当数组作为实参时,因为传递的是一个地址,所以形参改变,实参也会改变

二维数组

定义形式:类型  数组名[行数][列数]

int a[2][3];//共2行3列,6个元素,
即 两个包含三个元素的一维数组

在内存中的存储情况,例如int a[2][2]

(注意:a[0]、a[1]也是数组,是一维数组,而且a[0]、a[1]就是数组名,因此a[0]、a[1]就代表着这个一维数组的地址)

1> 数组a的地址是ffc1,数组a[0]的地址也是ffc1,即a = a[0];

2> 元素a[0][0]的地址是ffc1,所以数组a[0]的地址和元素a[0][0]的地址相同,即a[0] = &a[0][0];

3> 最终可以得出结论:a = a[0] = &a[0][0],以此类推,可以得出a[1] = &a[1][0]

printf("%p\n%p\n%p", a, a[0], &a[0][0]);

二维数组的初始化

*   按行进行初始化

int a[2][3] = { {2,2,3},
{3,4,5} };

* 按存储顺序进行初始化(先存放第1行,再存放第2行)

int a[2][3] = {2,2,3,3,4,5};

* 对部分元素进行初始化

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

int b[3][3] = { { }, { , ,2}, {1,2,3}};

* 如果只初始化了部分元素,可以省略行数,但是不可以省略列数

int a[][3] = {1,2,3,4,5,6};

int a[][3] = {{1,2,3},
{3,5}, {}};

为什么不能只省略列数呢? 因为int a[2][]={1,2,3,4,5,6} 这样无法确定元素在哪一行。

时间: 2024-10-29 19:07:36

C语言学习入门 (三) sizeof 函数、内存地址、数组的相关文章

C语言学习入门 (三) sizeof函数、内存地址、数组

sizeof可以用来计算一个变量或者一个常量.一种数据类型所占的内存字节数. sizeof(10); char c = 'a'; sizeof(c); sizeof(float); 地址 1.计算机中的内存是以字节为单位的存储空间.内存的每一个字节都有一个唯一的编号,这个编号就称为地址. 凡存放在内存中的程序和数据都有一个地址,也就是说,一个函数也有自己的内存地址 2.  当定义一个变量时,系统就分配一个带有唯一地址的存储单元来存储这个变量.比如: char a = 'A';// A的ASCII

Go语言学习笔记(三) [控制结构、内建函数]

日期:2014年7月21日 一.控制结构 1.Go中,只有几个控制结构,它没有do或者while循环,有for,灵活的switch语句和if,在switch中可以接受像for那样可选的初始化语句,另外Go中还提供了类型选择和多路通信转接器的select.Go的控制结构的语法和C相比有所不同,它不需要圆括号,但语句体必须总是包含在大括号内. 2.控制结构语法 1)if-else (1)if后紧跟单个条件 例如:if x > 0 {   //{必须和if在同一行,这是Go语法规定的,如果换行写,编译

C++语言学习(三)——封装(Encapsulation)

C++语言学习(三)--封装(Encapsulation) 一.封装简介 C语言等面向过程编程中,数据以及数据的相关操作函数都是分离的独立个体:在C++等面向对象编程中,数据以及数据的相关操作被设计为对象,对象包括属性(数据)和操作(函数),两者共同构成对象实体(即类实体).面向对象编程使程序更模块化,更易读易写,提升了代码重用到一个更高的层次.面向对象编程中,数据和数据的操作封装为了对象.封装可以隐藏实现细节,使得代码模块化,是把过程和数据包围起来,对数据的访问只能通过已定义的接口.封装是一种

JavaScript--基于对象的脚本语言学习笔记(三)

事件处理器 1.一个数据校验表单的例程 <html> <head> <title>js练习</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <script type="text/javascript"> String.prototype.trim=function(){ r

R语言学习(4)-环境和函数

环境和函数 1.环境 使用new.env函数创建环境 > an_environment <- new.env() 向环境中分配变量与列表相同 > an_environment[["pythag"]] <- c(12,15,20,21) > an_environment$root <- polyroot(c(6,-5,1)) > assign("moonday",weekdays(as.Date("1969/07/2

C语言学习总结(三) 复杂类型

第五章.复杂数据类型 (数组.字符串.指针.结构体.枚举.共同体) 1.什么是数组? 概念:把具有相同类型的若干变量按有序的形式组织起来,这些按序排列的同类数据元素的集合称为数组: 按数组元素的类型不同,数组又可分为: 数值数组:用来存储数值得 字符数组:用来存储字符 ‘a’ 指针数组:用来存放指针(地址)的 结构数组:用来存放一个结构体类型的数据 按维度分类: 一维数组 二维数组 多维数组 1.一维数组 概念:所有的元素都不是数组 使用流程:定义数组---->给数组初始化---->使用数组

C语言学习入门

编译文件:cc -c one.c two.c  生成.o目标文件 链接文件:cc one.o two.o     默认生成 a.out 执行文件 指定生成的可执行文件名   cc -o one one.o 连续编译.链接:cc one.c      cc -o one one.c    中间生成的.o文件会被删除,最后生成执行文件 cc one.c two.c   源文件超过一个时,目标.o文件便不会被删除, 以后可以只编译更改的源文件  cc one.o two.o three.c C语言32

【GO】GO语言学习笔记三

7.数组: 几乎是最常用的数据类型了... 数组就是指一系列同一类型数据 的集合.数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数 组的长度. 常规的数组声明方法: [32]byte // 长度为32的数组,每个元素为一个字节 [2*N] struct {x , y int32} //复杂类型数组 [1000]*float32 //指针数组 [3][5]int //二维数组 [2][2][2]float64 // 等同于[2]([2]([2]float64))

转MYSQL学习(三) 函数

这一节主要介绍MYSQL里的函数,MYSQL里的函数很多,我这里主要介绍MYSQL里有而SQLSERVER没有的函数 数学函数 1.求余函数MOD(X,Y) MOD(X,Y)返回x被y除后的余数,MOD()对于带有小数部分的数值也起作用,他返回除法运算后的精确余数 SELECT MOD(31,8) 2.四舍五入函数TRUNCATE(X,Y) TRUNCATE(X,Y)返回被舍去至小数点后y位的数字x.若y的值为0,则结果不带有小数点或不带有小数部分. 若y设为负数,则截去(归零)x小数点左边起第