一维数组,字符数组,字符串,二维数组在sizeof()和strlen()下的不同输出

来源:互联网 发布:linux snmptrap接收 编辑:程序博客网 时间:2024/05/22 08:03

1)一维数组

int main()//sizeof()计算变量所占空间大小

{

int a[] = { 1, 2, 3, 4 };

printf("%d\n", sizeof(a));//a单独出现在sizeof内部,表示整个数组,所以结果为16

printf("%d\n", sizeof(a+0));//a不单独出现,表数组首元素地址,加0还是首元素地址4

printf("%d\n", sizeof(*a));//*a表示首元素4

printf("%d\n", sizeof(a+1));//与上面a+0相同,表示第二个元素地址,还是地址,4

printf("%d\n", sizeof(a[1]));//第一个元素,4

printf("%d\n", sizeof(&a));//&a不是单独出现,而是在sizeof内部,不表示整个数组,降为表示整个数组地址4

printf("%d\n", sizeof(&a+1));//&a是整个数组,降为整个数组地址,加1就是跳过整个数组,不过还是地址4

printf("%d\n", sizeof(&a[0]));//是地址就是4

printf("%d\n", sizeof(&a[0]+1));//地址加1还是地址4

system("pause");

return 0;

}

2)字符数组

int main()//sizeof()计算变量所占空间大小

{

char arr[] = { 'a', 'b','c','d','e','f' };

printf("%d\n", sizeof(arr));//arr单独出现在sizeof内部,表示整个数组,所以结果为6个字符

printf("%d\n", sizeof(arr + 0));//arr不单独出现,表数组首元素地址,加0还是首元素地址4

printf("%d\n", sizeof(*arr));//*arr表示首元素a,一个字节为1

printf("%d\n", sizeof(arr[1]));//第2个元素,为1

printf("%d\n", sizeof(&arr));//&arr不是单独出现,而是在sizeof内部,不表示整个数组,降为表示整个数组地址4

printf("%d\n", sizeof(&arr + 1));//&arr是整个数组,降为整个数组地址,加1就是跳过整个数组,不过还是地址4

printf("%d\n", sizeof(&arr[0] + 1));//地址加1还是地址4

system("pause");

return 0;

}

---------------------------------------------------------

int main()//sizeof()计算变量所占空间大小

{

char arr[] = {"abcdef" };

printf("%d\n", sizeof(arr));//arr单独出现在sizeof内部,表示整个数组,所以结果为7,因为还有个\0

printf("%d\n", sizeof(arr + 0));//arr不单独出现,表数组首元素地址,加0还是首元素地址4

printf("%d\n", sizeof(*arr));//*arr表示首元素a,为1

printf("%d\n", sizeof(arr[1]));//第2个元素,为1

printf("%d\n", sizeof(&arr));//&arr不是单独出现,而是在sizeof内部,不表示整个数组,降为表示整个数组地址4

printf("%d\n", sizeof(&arr + 1));//&arr是整个数组,降为整个数组地址,加1就是跳过整个数组,不过还是地址4

printf("%d\n", sizeof(&arr[0] + 1));//地址加1还是地址4

system("pause");

return 0;

}

---------------------------------------------------------

int main()//sizeof()计算变量所占空间大小

{

char *p = "abcdef" ;

printf("%d\n", sizeof(p));//p为指针变量,指a的地址,4

printf("%d\n", sizeof(p + 1));//b的地址,4

printf("%d\n", sizeof(*p));//1个字符,1

printf("%d\n", sizeof(p[1]));//1个字符,1

printf("%d\n", sizeof(&p));//2级指针,4

printf("%d\n", sizeof(&p + 1));//跳到f之后,是个地址,4

printf("%d\n", sizeof(&p[0] + 1));//b的地址,4

system("pause");

return 0;

}

int main()//strlen(地址)从此地址开始向后,遇到\0停止;strlen(元素)就是error

{

char *p = "abcdef" ;

printf("%d\n", strlen(p));//p为指针变量,指a的地址,从a开始向后数,遇到\0停止,6

printf("%d\n", strlen(p + 1));//b的地址,从b开始向后数,5

//printf("%d\n", strlen(*p));//指元素,error

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

printf("%d\n", strlen(&p));//随机值

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

printf("%d\n", strlen(&p[0] + 1));//从b开始数,5

system("pause");

return 0;

}

3)二维数组

int main()//strlen(地址)从此地址开始向后,遇到\0停止;strlen(元素)就是error

{

int a[3][4] = { 0 };

printf("%d\n", sizeof(a));//整个数组,3×4×4=48

printf("%d\n", sizeof(a[0][0]));//首元素,4

printf("%d\n", sizeof(a[0]));//首行,16

printf("%d\n", sizeof(a[0]+1));//第一行第2个元素,a[0]没单独放在sizeof中,降为首元素,4

printf("%d\n", sizeof(a+1));//4

printf("%d\n", sizeof(&a[0] + 1));//&a[0]为第一行地址,加1是第2行地址,4

printf("%d\n", sizeof(*a));//首元素地址,是第一行地址,16?

printf("%d\n", sizeof(a[3]));//越界,但承接上面行的类型属性,16

system("pause");

return 0;

}

阅读全文
0 0
原创粉丝点击