C的指针和数组笔试题解析

//数组名的理解
//但是有3个例外
//1.sizeof(数组名)  这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节。
//2.&数组名         这里的数组名表示整个数组,取出的是整个数组的地址。
//3.除此之外所有的数组名都表示首元素的地址。

//strlen是库函数  求字符串长度的,统计的是在字符串中\0之前的字符的个数,如果没有\0就会一直往后找...

//表达式都有2个属性:
    //1.值属性 
    //2.类型属性 sizeof看的是类型属性
int main()
{
    //一维数组
    int a[] = { 1,2,3,4 };
    printf("%d\n", sizeof(a));//16
    printf("%d\n", sizeof(a + 0));//首元素地址,a+0还是首元素地址,地址大小根据x86还是x64,地址大小4/8
    printf("%d\n", sizeof(*a));//数组名a是数组首元素地址,*a就是首元素,大小是4个字节
    printf("%d\n", sizeof(a + 1));//数组名a是数组首元素地址,a+1就是第二个元素地址,大小是4/8个字节
    printf("%d\n", sizeof(a[1]));//数组的第二个元素的大小4个字节
    printf("%d\n", sizeof(&a));//&a是数组的地址,数组的地址也是地址,是地址4/8字节
    printf("%d\n", sizeof(*&a));//*&a是数组的地址的元素,大小16个字节
    printf("%d\n", sizeof(&a + 1));//&a+1是数组的地址,数组的地址也是地址,是地址4/8字节
    printf("%d\n", sizeof(&a[0]));//数组的第一个元素的地址,是地址4/8字节
    printf("%d\n", sizeof(&a[0] + 1));//数组的第二个元素的地址,是地址4/8字节

    //字符数组
    char arr[] = { 'a','b','c','d','e','f' };
    printf("%d\n", sizeof(arr));//整个数组大小6字节
    printf("%d\n", sizeof(arr + 0));//首元素地址,4/8
    printf("%d\n", sizeof(*arr));//数组首元素大小,1
    printf("%d\n", sizeof(arr[1]));//数组第二个元素大小,1
    printf("%d\n", sizeof(&arr));//整个数组的地址,4/8
    printf("%d\n", sizeof(&arr + 1));//4/8
    printf("%d\n", sizeof(&arr[0] + 1));//数组第二个元素的地址,是地址4/8

    //?代表随机值 
    // 因为字符数组中没有\0,所以在求字符串长度的时候
    // 会一直往后找,产生的结果就是随机值
    printf("%d\n", strlen(arr));//?
    printf("%d\n", strlen(arr + 0));//?
    printf("%d\n", strlen(&arr));//只是类型不同 ?
    printf("%d\n", strlen(&arr + 1));// ?-6
    printf("%d\n", strlen(&arr[0] + 1));//?-1
    //strlen需要的是个地址,*arr当传字符a时,a的ASCII是97
    //那就是将97作为地址传参,strlen从97这个地址开始统计字符串长度
    //这就非法访问内存了
    printf("%d\n", strlen(*arr));
    printf("%d\n", strlen(arr[1]));

    char arr1[] = "abcdef";
    printf("%d\n", sizeof(arr1));//7
    printf("%d\n", sizeof(arr1 + 0));//4/8
    printf("%d\n", sizeof(*arr1));//*arr1-->*(arr1+0)-->arr1[0] 1
    printf("%d\n", sizeof(arr1[1]));//1
    printf("%d\n", sizeof(&arr1));//4/8
    printf("%d\n", sizeof(&arr1 + 1));//4/8
    printf("%d\n", sizeof(&arr1[0] + 1));//4/8
    char arr2[] = "abcdec";
    printf("%d\n", strlen(arr2));//6
    printf("%d\n", strlen(arr2 + 0));//6
    printf("%d\n", strlen(*arr2));//*arr2<-->*(arr2+0)<-->arr2[0] 非法访问了!
    printf("%d\n", strlen(arr2[1]));// 非法访问!
    printf("%d\n", strlen(&arr2));// 是地址, 6
    printf("%d\n", strlen(&arr2 + 1));//是地址,?
    printf("%d\n", strlen(&arr2[0] + 1));//是地址 5

    int aa[3][4] = { 0 };
    printf("%d\n",sizeof(aa));//3*4*4=48
    printf("%d\n",sizeof(aa[0][0]));//4
    printf("%d\n",sizeof(aa[0]));//aa[0]是第一行一维数组的数组名,表示数组首元素的地址,
                                 //这里的sizeof,计算的是第一行一维数组的大小,16
    printf("%d\n",sizeof(aa[0]+1));//表示第一行一维数组的第二个元素的地址,4/8
    printf("%d\n",sizeof(*(aa[0]+1)));//表示第一行一维数组的第二个元素,4
    printf("%d\n", sizeof(aa+1));//aa是数组首元素的地址,是第一行的地址,
                                 //aa+1就是第二行的地址,所以是4/8
    printf("%d\n", sizeof(*(aa + 1)));//aa+1就是第二行的地址,相当于a[1][?],
                                      //所以计算的是整个第二行一维数组的大小,16
    printf("%d\n",sizeof(&aa[0]+1));//&a[0]是第一行的地址,
                                    //&a[0]+1是第二行的地址,4/8
    printf("%d\n", sizeof(*(&aa[0] + 1)));//16 计算第二行的大小
    printf("%d\n",sizeof(*aa));//aa就是第一行的地址,*aa就是第一行,*aa-->*(aa+0)-->aa[0],16
    printf("%d\n",sizeof(aa[3]));//aa[3]-->int [4],16
    return 0;
}

你可能感兴趣的:(c语言,c++,算法)