有关数组的运算(一)

准备工作

1.sizeof
sizeof是一个单目运算符,计算数据类型或变量长度(即所占字节数)
int 整型类型占4个字节;char 字符类型占1个字节;地址占四个字节
2.strlen
strlen(地址),以’\0’为结束标志计算字符串长度的函数(不包括’\0’)
3.&+数组名,数组名表示整个数组,这里取出的是整个数组的地址
sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小,单位是字节
除上述两种情况之外,遇到的所有的数组名都表示数组首元素的地址

一维整型数组

int main()
{
    int a[] = { 1, 2, 3, 4 };
    printf("%d\n", sizeof(a));//16---a表示整个数组,计算整个数组大小(单位是字节)
    printf("%d\n", sizeof(a+0));//4---a+0表示首元素的地址
    printf("%d\n", sizeof(*a));//4---a表示首元素地址,*解引用即首元素
    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));//16---&a表示数组的地址,*解引用表示整个数组大小
    printf("%d\n", sizeof(&a+1));//4---&a表示数组的地址加1,跳过整个数组的地址
    printf("%d\n", sizeof(&a[0]));//4---首元素的地址
    printf("%d\n", sizeof(&a[0] + 1));//4---首元素的地址加+1,即第二个元素的地址
    system("pause");
    return 0;
}

字符数组

int main()
{
    char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
    printf("%d\n", sizeof(arr));//6---arr表示整个数组大小
    printf("%d\n", sizeof(arr + 0));//4---arr+0表示首元素地址
    printf("%d\n", sizeof(*arr)); //1---*arr表示首元素
    printf("%d\n", sizeof(arr[1]));//1---arr[1]表示第二个元素
    printf("%d\n", sizeof(&arr));//4---&arr表示数组的地址
    printf("%d\n", sizeof(&arr + 1));//4---&arr表示数组的地址加1,跳过整个数组的地址
    printf("%d\n", sizeof(&arr[0] + 1));//4---&arr[0]首元素的地址加+1,即第二个元素的地址
    system("pause");
    return 0;
}
int main()
{
    char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
    printf("arr==%d\n", strlen(arr));//随机值--- arr表示首元素地址,但数组arr中没有'\0'结束标志,当strlen()函数从'a'数到'f'的时候会一直往后数
    printf("arr+0==%d\n", strlen(arr + 0));//随机值---表示首元素地址
    //printf("%d\n", strlen(*arr));//错误代码---*arr表示首元素,但strlen函数的参数是地址
    //printf("%d\n", strlen(arr[1]));//错误代码
    printf("&arr==%d\n", strlen(&arr));//随机值---表示数组的地址,但在值上和首元素地址一样
    printf("&arr+1==%d\n", strlen(&arr + 1));//随机值---&arr表示数组的地址加1,跳过整个数组的地址(其值与strlen(arr)差6printf("&arr[0]+1==%d\n", strlen(&arr[0] + 1));//随机值---&arr[0]首元素的地址加+1,即第二个元素的地址(其值与strlen(arr)差1system("pause");
    return 0;
}

这里写图片描述

int main()
{
    char arr[] = "abcdef";
    printf("%d\n", sizeof(arr));//7---arr表示整个数组
    printf("%d\n", sizeof(arr + 0));//4---数组首元素地址
    printf("%d\n", sizeof(*arr));//1---数组首元素
    printf("%d\n", sizeof(arr[1]));//1---数组首元素
    printf("%d\n", sizeof(&arr));//4---数组的地址
    printf("%d\n", sizeof(&arr + 1));//4----数组的地址加1,跳过整个数组的地址
    printf("%d\n", sizeof(&arr[0] + 1));//4---首元素的地址加+1,即第二个元素的地址
    system("pause");
    return 0;
}
int main()
{
    char arr[] = "abcdef";
    printf("%d\n", strlen(arr));//6---arr表示数组首元素地址
    printf("%d\n", strlen(arr + 0));//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));//随机值---数组的地址加1,跳过整个数组的地址
    printf("%d\n", strlen(&arr[0] + 1));//5---&arr[0]首元素的地址加+1,即第二个元素的地址
    system("pause");
    return 0;
}
int main()
{
    char *p = "abcdef";
    printf("%d\n", sizeof(p));//4---p表示指针变量保存‘a'的地址(指针变量就是地址)
    printf("%d\n", sizeof(p + 1));//4---p+1表示‘b'的地址
    printf("%d\n", sizeof(*p));//1---p指向字符首地址,*解引用即表示'a'
    printf("%d\n", sizeof(p[0]));//1---p[0]表示字符串第一个元素
    printf("%d\n", sizeof(&p));//4---&p表示指针变量p的地址
    printf("%d\n", sizeof(&p + 1));//4---跳过一个指针地址大小(即四个字节)的地址
    printf("%d\n", sizeof(&p[0] + 1));//4---字符串首元素的地址加+1,即第二个元素的地址

    printf("%d\n", strlen(p));//6---p指向字符串首元素地址,即计算整个字符串长度(不包括'\0')
    printf("%d\n", strlen(p + 1));//5---字符串首元素的地址加+1,即第二个元素的地址,即计算从第二个字符开始的字符串长度
    //printf("%d\n", strlen(*p));//错误代码
    //printf("%d\n", strlen(p[0]));//错误代码
    printf("%d\n", strlen(&p));//随机值---&p表示指针变量p的地址,没有要求的字符串(即没有'\0')函数会任意取值结束
    printf("%d\n", strlen(&p + 1));//随机值---跳过一个指针地址大小(即四个字节)的地址,没有要求的字符串(即没有'\0')函数会任意取值结束
    printf("%d\n", strlen(&p[0] + 1));//5---字符串首元素的地址加+1,即第二个元素的地址,即计算从第二个字符开始的字符串长度
    system("pause");
    return 0;
}

二维数组

int main()
{
    int a[3][4] = { 0 };          
    printf("%d\n", sizeof(a));//48---a表示整个数组的大小
    printf("%d\n", sizeof(a[0][0]));//4---第一行第一个元素(整型)
    printf("%d\n", sizeof(a[0]));//16---a[0]为第一行数组名,即第一行数组的大小
    printf("%d\n", sizeof(a[0] + 1));//4---a[0]+1中a[0]表示第一行第一个元素的地址,加1即表示第一行第二个元素的地址
    printf("%d\n", sizeof(a + 1));//4---a+1中a表示第一行元素的地址,加1即表示第二行的地址
    printf("%d\n", sizeof(&a[0] + 1));//4---&a[0]表示第一行元素的地址加1,即第二行元素的地址
    printf("%d\n", sizeof(*a));//16---*a中a第一行元素的地址,*解引用即第一行元素的大小
    printf("%d\n", sizeof(a[3]));//16---a[3]为数组名,即第几行数组的大小(虽然a[3]越界,但是sizeof中不计算)
    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/HL_HLHL/article/details/79344009