c笔记06---数组

1.    数组,输入一个不大于五位数的整数,每位数字,分别存储在数组里:
    拆分为每位数字:value % 10; value /= 10;
    为保证输入的是三位(或更小)数,导致数组输出时出现 0 ,所以给数组初始化为 -1。

2.    arr 是数组名称,指的是首个数组地址;
    arr, arr[0] 地址一样;
    arr = 1; 错误,数组名称地址不可以被赋值,数组名称显示为地址;

3.    数组地址变量作加减运算,不是简单的数值上的加减运算: &arr + 1 和 arr + 1 地址值不一样。
    &arr + 1, 此处 1  是整个数组地址大小;
    arr + 1, 此处 1 是变量地址大小。 arr + 1 和 arr[1] 地址一样;
    记住: *(arr + 1) = arr[1];
    printf("%d ", arr[i]); 等价于 printf("%d ", *(arr + i));

    举例:
    int data[3][4];
    data 代表数组的首地址,也就是数组中第一个元素的地址,data 也就是第一行的首地址,
    与第一行中第一个元素的地址相同,但是级别不一样;
    下面这段代码都从地址角度分析:
        &data;                    // 和 data 的值一样
        data + 1;                // 加一行,相当于指向第二行首地址
        &data + 1;                // 增加整个数组长度
        data[0] + 1;            // 增加一个元素地址,data[0][1]的地址
        *(data + 1);            // 增加一行地址,拿到第二行中第一个元素地址data[1][0]
        *(data + 1) + 1;        // 后一个 1 是增加一个元素地址,data[1][1]
        &data[0] + 1;            // 增加一整行地址,data[1][0]
    总结:对数组名取 &,提高其级别;取 * 降低其级别;

    int arr[5];    
    int *p = &arr[2];
    int k = p[-2];                // ok, k = arr[0];
    
    问:简述数组与指针的区别 ?
    答:数组要么在静态存储区被创建(如全局数组),要么在栈上被创建;指针可以随时指向任意类型的内存块。
    1)修改内容上的差别
    char a[] = "hello";
    a[0] = 'X';
    char *p = "word";                 // 注意 p 指向常量字符串
    p[0] = 'X';                     // 编译器不能发现该错误,运行时错误
    2) 用运算符 sizeof 可以计算出数组的容量(字节数);
    sizeof(p),p 为指针得到的是一个指针变量的字节数,而不是 p 所指的内存容量。
    C++/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。
    注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。
    char a[] = "hello world";
    char *p = a;
    cout<< sizeof(a) << endl;        // 12 字节
    cout<< sizeof(p) << endl;        // 4 字节
    计算数组和指针的内存容量
    void Func(char a[100]) {
        cout<< sizeof(a) << endl;    // 4 字节而不是 100 字节
    }

4.    对数组名称用 sizeof(arr),得出来的是整个数组的地址大小;
    sizeof(arr) / sizeof(arr[0]) 得出数组个数;

5.    数组初始化问题:
    int arr[];                    // 编译错误
    int arr[5];                    // 编译可以通过,数组元素为随机数
    int arr[5] = {1, 5, 3};        // 其他数据初始化为 0;
    int arr[5] = {0};            // 把每个元素初始化为 0;
    int arr[5] = {[0] = 1, [1] = 5, [2] = 3};
    int arr[5] = {};            // 不推荐,会产生随机数;
    int arr[] = {1, 5, 3, 4};    // 不推荐;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值