牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2017-07-31 投稿人: 浏览次数:523

(1)一维数组

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

{

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

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

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

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

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

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

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

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

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

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

system("pause");

return 0;

}

(2)字符数组

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

{

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

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

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

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

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

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

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

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

system("pause");

return 0;

}

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

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

{

char arr[] = {"abcdef" };

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

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

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

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

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

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

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

system("pause");

return 0;

}

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

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

{

char *p = "abcdef" ;

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

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

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

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

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

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

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

system("pause");

return 0;

}

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

{

char *p = "abcdef" ;

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

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

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

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

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

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

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

system("pause");

return 0;

}

(3)二维数组

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

{

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

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

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

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

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

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

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

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

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

system("pause");

return 0;

}

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。