zoukankan      html  css  js  c++  java
  • 《c和指针》笔记6

    一维数组

      首先是对于声明的变量的解释,代码如下:

    int a;
    int b[10];

      a是一个标量(原先我也是不晓得为什么叫做标量),因为a是一个单一的值,b是数组,是一些值的集合。数组名是一个指向该数组内第一个元素类型的指针,但是数组跟指针是存在一些区别的。

      1、数组是能确数量的元素。

      2、数组名是常量指针,而指针是一个标量。

      *在作为sizeof操作符和&操作符的操作数时,数组名不用指针常量来表示。

    1 int a[10];
    2 int b[10];
    3 int *c;
    4 ...
    5 c = &a[0];
    6 b = a;
    7 a = c;

      第5行是合法的,c为指向数组a第一个元素的指针,前面我们说到数组名是指向数组内第一个元素的常量指针,因此表达式等于c = a.

      第6行是非法的,因为我们不能直接将一个数组的所有元素复制给另一个数组,必须通过循环对于数组内的元素一个个复制。

      第7也是非法的,因为数组名在表达式中是一个常量指针,常量是不能能被修改的。

    下标引用

    *(a + 3)

      该表达式的结果相当于a[3]。因为a的值是指向整型的指针,对a进行加法运算的结果是a所指向的数组的第一个元素向后移动3个整型长度的位置。

      因此我们可以的得出array[subscript] = *(a + (subscript))。以下有个例子来说明:

    int array[10];
    int *ap = array + 2;
    
    ap == &array[2];//从初始化得出ap是指向数组向后移动2个整型长度的位置
    *ap == *(array + 2) == array[2];
    ap[0] == *(ap + 0) == array[2]//从上一个表达式我们可以推导出来
    ap + 6 == array + 8 == &array[8]//因为ap原本就是指向数组内第3个元素的位置,因此向后移动6个整型长度的位置便是第9个元素的位置
    *ap + 6 == array[2] + 6//这里要注意,因为运算顺序是从右往左的也就是6加上ap间接取址后的值
    *(ap + 6) == array[8]//不解释
    ap[6] == *(ap + 6) == &array[8]//从ap[0]我们可以推导出
    &ap//array没有与之相等的表达式,因为我们不能确定ap相对于array处于何种位置
    ap[-1] == *(ap - 1) == array + (2 - 1) == &array[1]
    ap[9]//按照运算的出应该与array[11]相等 但是已经超出了数组的长度

      

      今天就到这里,明天继续,加油!

  • 相关阅读:
    Note/Solution 转置原理 & 多点求值
    Note/Solution 「洛谷 P5158」「模板」多项式快速插值
    Solution 「CTS 2019」「洛谷 P5404」氪金手游
    Solution 「CEOI 2017」「洛谷 P4654」Mousetrap
    Solution Set Border Theory
    Solution Set Stirling 数相关杂题
    Solution 「CEOI 2006」「洛谷 P5974」ANTENNA
    Solution 「ZJOI 2013」「洛谷 P3337」防守战线
    Solution 「CF 923E」Perpetual Subtraction
    KVM虚拟化
  • 原文地址:https://www.cnblogs.com/ahl5esoft/p/2555573.html
Copyright © 2011-2022 走看看