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} 这样无法确定元素在哪一行。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。