天天看點

C語言有關數組的運算

在開始之前,我們先來複習一下基礎知識:

  • sizeof是一個單目運算符,計算資料類型或變量長度(包括‘\0’);
  • strlen(位址),以’\0’為結束标志計算字元串長度的函數(不包括’\0’);
  • &+數組名,數組名表示整個數組,這裡取出的是整個數組的位址 ;
  • sizeof(數組名),數組名表示整個數組,計算的是整個數組的大小,機關是位元組
  • 除了以上兩種形式表示整個數組之外,其餘情況當遇到數組名時均表示數組首元素的大小!

    下面我們來一起看一些常用的例子吧!

一、一維數組
int main()
{
    int a[] = { , , ,  };
    printf("%d\n", sizeof(a));//16-->sizeof(a)表示整個數組,計算整個數組大小,機關位元組,這裡a是整型數組,有四個元素,是以是16
    printf("%d\n", sizeof(a + ));//4-->a+0表示數組首元素的位址,即“1”的位址
    printf("%d\n", sizeof(*a));//4-->a代表數組首元素的大小,對a解引用,就是首元素的大小
    printf("%d\n", sizeof(a + ));//4-->類似于上述的a+0,這裡代表的是“2”的位址
    printf("%d\n", sizeof(a[]));//4-->相當于上述的a+1,代表的是“2”的位址
    printf("%d\n", sizeof(&a));//4-->&a表示整個數組的位址,在32位平台下,一個位址的大小為4
    printf("%d\n", sizeof(*&a));//16-->&a表示整個數組的位址,解引用表示整個數組的大小
    printf("%d\n", sizeof(&a + ));//4-->&a表示整個數組,再加一表示跳過整個數組後的下一個元素位址,雖然不存在,求位址仍然是合法的,通路就不合法了
    printf("%d\n", sizeof(&a[]));//4-->首元素的位址
    printf("%d\n", sizeof(&a[] + ));//4-->首元素位址加一,即就是第二個元素“2”的位址

    return ;
}
           

運作結果:

C語言有關數組的運算
二、字元數組
  • 1.
int main()
{
    char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
    printf("%d\n", sizeof(arr));//6-->arr表示整個數組的大小
    printf("%d\n", sizeof(arr + ));//4-->數組首元素的位址
    printf("%d\n", sizeof(*arr));//1-->數組首元素的大小
    printf("%d\n", sizeof(arr[]));//1-->數組第二個元素的大小
    printf("%d\n", sizeof(&arr));//4-->數組的位址
    printf("%d\n", sizeof(&arr + ));//4-->整個數組加一,和上面原理相同
    printf("%d\n", sizeof(&arr[] + ));//4-->第二個元素的位址

    printf("%d\n", strlen(arr));//随機值-->arr表示首元素位址,但數組arr中沒有'\0'結束标志,當strlen()函數從'a'數到'f'的時候會一直往後數
    printf("%d\n", strlen(arr + ));//随機值-->表示的仍然是首元素的位址,道理和上面的這個類似
    //printf("%d\n", strlen(*arr));//錯誤-->*arr代表數組首元素的大小,但是strlen求的是參數的位址
    //printf("%d\n", strlen(arr[1]));//錯誤-->arr[1]代表字元'b',通路strlen('b')是無效的
    printf("%d\n", strlen(&arr));//随機值-->表示數組的位址
    printf("%d\n", strlen(&arr + ));//随機值-->跳過整個數組的位址的一個随機值(和strlen(arr)相差6)
    printf("%d\n", strlen(&arr[] + ));//随機值-->數組第二個元素的一個随機值(和strlen(arr)相差1)

    return ;
}
           

運作結果:出現報錯

C語言有關數組的運算
  • 2.
int main()
{
    char arr[] = "abcdef";
    printf("%d\n", sizeof(arr));//7---arr表示整個數組
    printf("%d\n", sizeof(arr + ));//4---數組首元素位址
    printf("%d\n", sizeof(*arr));//1---數組首元素
    printf("%d\n", sizeof(arr[]));//1---數組首元素
    printf("%d\n", sizeof(&arr));//4---數組的位址
    printf("%d\n", sizeof(&arr + ));//4----數組的位址加1,跳過整個數組的位址
    printf("%d\n", sizeof(&arr[] + ));//4---首元素的位址加+1,即第二個元素的位址

    printf("%d\n", strlen(arr));//6---arr表示數組首元素位址
    printf("%d\n", strlen(arr + ));//6---arr+0表示數組首元素位址
    //printf("%d\n", strlen(*arr));//錯誤代碼
    //printf("%d\n", strlen(arr[1]));//錯誤代碼
    printf("%d\n", strlen(&arr));//6---表示數組的位址,但在值上和首元素位址一樣
    printf("%d\n", strlen(&arr + ));//随機值---數組的位址加1,跳過整個數組的位址
    printf("%d\n", strlen(&arr[] + ));//5---&arr[0]首元素的位址加+1,即第二個元素的位址

    return ;
}
           

運作結果:

C語言有關數組的運算
  • 3.
int main()
{
    char *p = "abcdef";
    printf("%d\n", sizeof(p));//4-->P是指針變量的值,指針變量就是位址,儲存“a”的位址
    printf("%d\n", sizeof(p + ));//4-->表示“b”的位址
    printf("%d\n", sizeof(*p));//1-->p指向首元素的位址,解引用後表示“a”的大小
    printf("%d\n", sizeof(p[]));//1-->表示字元串第一個元素的大小
    printf("%d\n", sizeof(&p));//4-->指針變量的位址
    printf("%d\n", sizeof(&p + ));//4-->跳過一個指針位址的大小的位址
    printf("%d\n", sizeof(&p[] + ));//4-->表示第二個元素的位址

    printf("%d\n", strlen(p));//6-->p指向字元串首元素位址,即計算整個字元串長度(不包括'\0')
    printf("%d\n", strlen(p + ));//5-->字元串首元素的位址加+1,即第二個元素的位址,即計算從第二個字元開始的字元串長度
    //printf("%d\n", strlen(*p));//錯誤-->strlen函數裡面存放的是位址!!!
    //printf("%d\n", strlen(p[0]));//錯誤-->strlen函數裡面存放的是位址!!!
    printf("%d\n", strlen(&p));//随機值-->&p代表取字元a的位址的位址,不知道\0的位置
    printf("%d\n", strlen(&p + ));//随機值-->&p代表取字元a的位址的位址,不知道\0的位置
    printf("%d\n", strlen(&p[] + ));//5-->從字元b開始統計,遇到f後面的\0停止

    return ;
}
           

運作結果:

C語言有關數組的運算
三、二維數組
int main()
{
    int a[][] = {  };
    printf("%d\n", sizeof(a));//48-->sizeof(數組名),代表整個數組大小
    printf("%d\n", sizeof(a[][]));//4-->第一行第一個元素的大小,4個位元組
    printf("%d\n", sizeof(a[]));//16-->第一行元素的大小4*4
    printf("%d\n", sizeof(a[] + ));//4-->第一行第二個元素的大小
    printf("%d\n", sizeof(a + ));//4-->第二行第一個元素的位址
    printf("%d\n", sizeof(&a[] + ));//4-->第二行的位址
    printf("%d\n", sizeof(*a));//16-->第一行元素的大小4*4
    printf("%d\n", sizeof(a[]));//16--> sizeof内部的表達式不參與運算,a[3]代表數組第四行的元素的大小,4*4=16個位元組,雖然沒有第四行,求大小可以,通路不行
    //在對數組進行運算時,對指針解引用,取決于指針的類型

    return ;
}
           
C語言有關數組的運算

繼續閱讀