C:数组

1. 什么是数组

数组是一组数目固定,类型相同的数据项,数组中的数据项称为元素。
数组中的元素固定,每个数组的元素都是 int,long或其他类型。
声明一个数组:
long numbers[10];
括号中的数字定义了要存放数组中的元素个数,称为数组维 array dimension;

数组中的每个值由索引值(index value)来识别,
索引值是一个整数。从0开始的连续整数。

如果程序里使用的索引值超过了数组的合法范围,程序将不能正常运行。
编译器检查不出这种错误,程序仍可以编译,但是执行是有问题的。

2. 内存

计算机的内存可以看做一排很整齐的盒子,每个盒子有2中状态:满(称为 1 )和空(称为 0),
每个盒子都包含一个二进制数,称为 位( bit )
为了方便, 8个盒子组合为一组,每组称为字节(byte)
要辨识每个字节,以访问其内容,用数字标记字节,称为地址。

& 称为寻址运算符,
广泛用于scanf函数, &放在变量名前面,获取变量的地址。
#include <stdio.h>

int main(void){
    long a = 1L; 
    long b = 2L; 
    long c = 3L; 

    double d = 4.0;
    double e = 5.0;
    double f = 6.0;

    printf("long type occupies %lu bytes\n", sizeof(long));
    printf("address of a is: %p, b is : %p, c is : %p\n\n", &a, &b, &c);

    printf("double type occupies %lu bytes\n", sizeof(double));
    printf("address of d is : %p, e is : %p, f is : %p\n", &d, &e, &f);

    return 0;
}
执行结果
$ ./a.out 
long type occupies 8 bytes
address of a is: 0x7fff5dff2c00, b is : 0x7fff5dff2bf8, c is : 0x7fff5dff2bf0

double type occupies 8 bytes
address of d is : 0x7fff5dff2be8, e is : 0x7fff5dff2be0, f is : 0x7fff5dff2bd8
格式指定符%p, 来输出变量的内存地址,16进制。
long类型占8个字节, 输出的地址逐渐变小,b比a低8, c比b低8.

3. 数组与地址

声明数组时,指定值的类型和元素个数。值的类型决定了每个元素需要的字节数。
看数组的地址,和存储的内容:
#include <stdio.h>
int main(void){
    int data[5];
    for(int i = 0; i<5; i++){
        data[i] = 12 * (i + 1); 
        printf("data[%d] address: %p, content: %d\n", i, &data[i], data[i]);
    }   

    return 0;
}
执行结果
$ ./a.out 
data[0] address: 0x7fff5bd97bf0, content: 12
data[1] address: 0x7fff5bd97bf4, content: 24
data[2] address: 0x7fff5bd97bf8, content: 36
data[3] address: 0x7fff5bd97bfc, content: 48
data[4] address: 0x7fff5bd97c00, content: 60
每个元素地址大于前一个元素, 占用4个字节。

4. 数组的初始化

double values[3] = {1.5, 2.5, 3.5};
声明包含3个元素的数组values。
double values[5] = {1.5, 2.5, 3.5};
如果初始的个数(3个)少于元素数(5),则后面元素初始为0;
如果初始的个数大于元素数,编译器就会报错。
int primes[] = {1, 2, 3, 4, 5};
没有指定元素个数, 则根据初始值个数确定, 上面的primes数组有5个元素。

5. 数组的大小

sizeof可以计算指定类型变量占用的字节数。
#include <stdio.h>
int main(void){
    printf("long type size is : %lu bytes.", sizeof(long));

    double value = 1.0;
    printf("\n the size of value is %lu bytes.", sizeof value);
    return 0;
}
执行结果
$ ./a.out 
long type size is : 8 bytes.
 the size of value is 8 bytes.
sizeof 可以用于数组。
    double values[5] = {1.5, 2.5, 3.5, 4.5, 5.5};
    printf("the size of values array, is : %lu bytes.\n", sizeof values);
//结果
the size of values array, is : 40 bytes.
5个元素,每个元素double占8个字节, 共40字节。

6. 多维数组

float number[3][5];
一个3行5列的数组。
#include <stdio.h>
int main(void){
    int numbers[3][4] = { 
        {10, 20, 30, 40},
        {50, 60},
    };  

    printf("this size of numbers is %lu\n", sizeof numbers);
    return 0;
}

//结果
this size of numbers is 48
3行4列, 没有赋值的元素默认为0. 总共占48字节, int为4bytes。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值