数组的运算


    在进行数组运算之前,  首先,我们需要对 arr, &arr, &arr[0]有一个很好的了解


  看代码:

      数组的运算

  运行结果:

         数组的运算

 

      可见三者的值相同,那么三者是不是绝对相同呢?

   再仔细分析下列代码:

       数组的运算

    运行结果:

        数组的运算

    由此得出结论:虽然arr, &arr, &arr[0]三者值相同,但三者类型并不相同

                   数组名-----arr  表示数组首元素的地址

                   arr+1   则表示第二个元素的地址

                   &arr[0]   表示第一个元素的地址

                   &arr[0]+1则表示第二个元素的地址

                   &arr  表示整个数组的地址

                   &arr+1 则跳过整个数组


有关数组的运算

     经过上面的分析后,接下来正式开始数组的运算


        这里简单介绍下sizeof() 和 strlen()

            sizeof()    C/C++操作符

                作用:返回类型所占的内存字节数

            strlen(字符数组)    一个函数

                作用:测量字符串长度的函数。函数的值为字符串的实际长度(不包括’\0’在内)

            注:strlen()参数必须是字符型指针(char*,且必须是以’\0’结尾的

      

  1.一维数组

        数组的运算


        这里需要注意 sizeof()什么时候测量数组大小

        

       分析: sizeof(a)  数组名放于sizeof()内部,表示整个数组的大小,单位字节

             sizeof(a+0)   不是数组名放于sizeof()内部,则数组名降级变为数组首元素地址,a+0则表示数组第一个元素的地址。同理,a+1 表示第二个元素的地址

             sizeof(*a)  a表示首元素地址,*a 对a进行解引用,则表示a所指向地址的内容,即首元素

             sizeof(&a)  &a 表示数组的地址,则&a+1 表示跳过整个数组的地址   *&a (整型的地址解引用能访问一个整型,字符的地址解引用能访问一个字符,)数组的地址解引用则访问整个数组的大小 



       字符数组

         数组的运算

        运行结果:

           数组的运算


      数组的运算


            

             分析: char arr[] = {‘a’,’b’,’c’,’d’,’e’,’f’}  数组中只存放了a b c d e f 数组大小为6

                        char arr[] = “abcdef”  数组中存放了a b c d e f \0 数组大小为7



    字符串:

         数组的运算

          数组的运算

          解释:

                Char *p = “abcdef”;

         数组的运算

                常量字符串放于内存的只读内存区,p中存放’a’的地址,&p为指针变量p的地址.

        

  2.二维数组 

      二维数组可被看作是一种特殊的一维数组,它的元素又是一个一维数组

        Eg: int  a[3][4]

           a可看作是一个一维数组,它有三个元素:a[0],a[1],a[2]

          每个元素又是一个一维数组:

              a[0] -----------    a[0][0]    a[0][1]   a[0][2]    a[0][3]

              a[1] -----------    a[1][0]    a[1][2]   a[1][2]    a[1][3]

              a[2] -----------    a[2][0]    a[2][1]   a[2][2]    a[2][3]


      数组的运算


       现在我们来看下面的运算:

    数组的运算

    

         分析:

              sizeof(a[0]) a[0] 第一行数组名,则sizeof(a[0]) 表示第一行大小

              sizeof(a[0]+1)  a[0]第一行数组名,没有单独放于sizeof()内部,则a[0]降级为首元素的地址,a[0]+1 表示第一行第二个元素

              sizeof(a+1)  a表示二维数组数组名,没有单独放于sizeof()内部,数组名降级为首元素地址(a[0]),a[0]+1则表示第二行地址


           注:sizeof()内部表达式不参与运算


    

    

  总结:

       数组名代表整个数组的时候只有两种情况:
                  sizeof(数组名),这里的数组名表示整个数组。
                 &数组名,这里的数组名表示整个数组。 

        除此之外,所有的数组名均代表数组首元素的地址