有关数组的运算

    xiaoxiao2021-03-25  342

    1    定义一个一维整型数组   int a[ ]={1,2,3,4}  

    printf("%d\n",sizeof(a))     输出为16    //数组名单独放在sizeof内,求取的是整个数组的大小

    printf("%d\n",sizeof(*a))               4    //a代表首元素的地址,对a解引用,就是首元素的大小

    printf("%d\n",sizeof(a+0))            4    //a+0代表数组首元素,这里求的是首元素的大小

    printf("%d\n",sizeof(a+1))            4    //a+1代表数组的第二个元素

    printf("%d\n",sizeof(a[1]))            4    //a[1]代表数组的第二个元素

    printf("%d\n",sizeof(&a))              4    //&a指整个数组的地址,一个地址的大小为4个字节

    printf("%d\n",sizeof(&a+1))          4    //&a+1指数组外面的地址,仍是4个字节

    printf("%d\n",sizeof(&a[0]))          4    //&a[0]代表数组首元素的地址,为4个字节

    printf("%d\n",sizeof(&a[0]+1))      4    //&a[0]+1代表数组第二个元素的地址,为4个字节

    printf("%d\n",sizeof(*&a))             4    //&a指整个数组的地址,解引用之后求的是整个数组的大小

    2  定义一个字符数组   char arr[ ]={a,b,c,d,e,f} 

    printf("%d\n",sizeof(arr))             6   //求取整个数组的大小

    printf("%d\n",sizeof(arr+0))         4   //求取数组首元素的地址的大小

    printf("%d\n",sizeof(*arr))            1   //arr代表首元素的地址,*a指首元素a的大小

    printf("%d\n",sizeof(arr[1]))         1   //arr[1]代表数组的第二个元素,它的大小为一个字节

    printf("%d\n",sizeof(&arr))          4    //&rr指整个数组的地址,其大小为4个字节

    printf("%d\n",sizeof(&arr+1))      4    //数组外面的地址,仍是4个字节

    printf("%d\n",sizeof(&arr[0]+1))   4   //数组第二个元素的地址,大小为4个字节

    用strlen求取字符数组的大小

    首先说明一点,strlen在求取字符串长度的时候遇到\0就停止统计

    printf("%d\n",strlen(arr))       随机值    //该字符数组没有\0,所以该数组的大小不能确定

    printf("%d\n",strlen(arr+0))   这个值和上面的值一样,因为它们都是从数组的首元素开始查找

    printf("%d\n",strlen(*arr))     error //*arr代表字符'a',访问strlen('a')的方法是无效的

    printf("%d\n",strlen(arr[1]))  error //arr[1]代表字符'b',访问strlen('b')的方法是无效的

    printf("%d\n",strlen(&arr))          随机值    

    printf("%d\n",strlen(&arr+1))      随机值  //&arr+1跳到数组外面,strlen从数组的外面开始统计字符的个数

    printf("%d\n",strlen(&arr[0]+1))   随机值 //strlen从数组的第二个元素开始统计字符的个数

     3  定义一个字符指针数组    char *p="abcdef"

    首先 char *p="abcdef"表示把字符a的地址存到指针变量p中

    printf("%d\n",sizeof(p))            4  //p是一个指针变量,大小为4个字节

    printf("%d\n",sizeof(p+1))        4  //(p+1)中存放的是字符b的地址,是用一个指针变量存放的,大小为4个字节

    printf("%d\n",sizeof(*p))           1 //*p表示字符a的大小,为1个字节

    printf("%d\n",sizeof(p[0]))         1  //求的是数组首元素a的大小

    printf("%d\n",sizeof(&p))           4  //指整个数组的地址,其大小为4个字节

    printf("%d\n",sizeof(&p+1))       4  //数组外的一个地址的大小

    printf("%d\n",sizeof(&p[0]+1))   4 //数组第二个元素的地址的大小

     用strlen求取字符数组的大小

    printf("%d\n",strlen(p))           6//f后面的字符是\0

    printf("%d\n",strlen(p+1))      5//从字符b开始统计

    printf("%d\n",strlen(*p))         error//不能访问strlen('a')

    printf("%d\n",strlen(p[0]))      error//同上

    printf("%d\n",strlen(&p))       随机值//&p代表取字符a的地址的地址,不知道\0的位置

    printf("%d\n",strlen(&p+1))   随机值//同上

    printf("%d\n",strlen(&p[0]+1))   5//从字符b开始统计,遇到f后面的\0停止

    4  定义一个二维数组  int a[3][4]={0}

    printf("%d\n", sizeof(a));    //48  a表示整个数组,大小为12*4=48个字节

    printf("%d\n", sizeof(a[0][0])); //4 a[0][0]表示数组第一个元素,大小为4个字节

    printf("%d\n", sizeof(a[0]));    //16 a[0]表示数组第一行元素,大小为4*4=16个字节

    printf("%d\n", sizeof(a[0] + 1)); //4 a[0]表示a[0][0]的地址,a[0]+1表示a[0][1]的地址

    printf("%d\n", sizeof(a + 1));    //4  a表示首元素的地址,a+1表示第二行第一个元素的地址

    printf("%d\n", sizeof(&a[0] + 1));  //4 &a[0] + 1表示取第二行的地址

    printf("%d\n", sizeof(*a));      //16   *a表示第一行的元素的大小,4*4=16个字节

    printf("%d\n", sizeof(a[3]));   //16     sizeof内部的表达式不参与运算,a[3]代表数组第四行的元素的大小,4*4=16个字节

    在对数组进行运算时,对指针解引用,取决于指针的类型

    转载请注明原文地址: https://ju.6miu.com/read-76.html

    最新回复(0)