int main()
{
//一维数组
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));// 4*8=16. sizeof(数组名),表示取整个数组的长度;
printf("%d\n", sizeof(a + 0));// 4/8. 数组名+0表示首元素地址,32位下地址为4,64位下,地址为8;
printf("%d\n", sizeof(*a));// 4. *a表示对首元素地址解引用,得到1,而1是整型,在内存中占4个字节;
printf("%d\n", sizeof(a + 1));// 4/8. 首元素地址+1表示第二个元素的地址;
printf("%d\n", sizeof(a[1]));// 4. 表示第二个元素占内存空间的大小,单位为字节;
printf("%d\n", sizeof(&a));// 4/8. &a表示对整个数组a取地址,而地址占内存空间4or8 byte;
printf("%d\n", sizeof(*&a));//16. ???取整个数组的地址,解引用出整个数组
printf("%d\n", sizeof(&a + 1));//4/8。取数组整个地址,+1越过了数组地址,指向数组后的一块内存,内存大小为4/8byte
printf("%d\n", sizeof(&a[0]));//4. 取第一个元素的地址
printf("%d\n", sizeof(&a[0] + 1));//4. 第二个元素的地址
//字符数组
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr));//6. sizeof(数组名)表示整个数组所占内存空间的大小,单位是byte
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. 表示整个字符数组arr地址所占空间的大小
printf("%d\n", sizeof(&arr + 1));//4/8. 表示指向跳过整个数组后面的内存空间的大小
printf("%d\n", sizeof(&arr[0] + 1));//4/8. 表示第二个元素地址所占内存空间的大小
printf("%d\n", strlen(arr));//随机值 。arr表示首元素地址,strlen(arr)表示从arr地址开始直到'\0'位置前,字符的个数
printf("%d\n", strlen(arr + 0));//随机值。同上
//printf("%d\n", strlen(*arr));//错误。对首元素地址解引用为'a',a的ASCII为97,不是地址
//printf("%d\n", strlen(arr[1]));//错误。同上
printf("%d\n", strlen(&arr));//随机值。
printf("%d\n", strlen(&arr + 1));//随机值。
printf("%d\n", strlen(&arr[0] + 1));//随机值。
char arr[] = "abcdef";
//相当于 char arr[] = {'a', 'b', 'c', 'd', 'e', 'f', '\0'};
printf("%d\n", sizeof(arr));//7,表示整个数组所占内存空间的大小,而在此字符中,包含'\0';
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.表示第二个元素地址所占内存空间的大小
printf("%d\n", strlen(arr));//6.表示从首元素地址开始,向后找'\0',找到后,在'\0'之前的元素总个数
printf("%d\n", strlen(arr + 0));//6.表示首元素地址,从首元素地址开始,向后找'\0',找到后,在'\0'之前的总元素个数
//printf("%d\n", strlen(*arr));//错误。
//printf("%d\n", strlen(arr[1]));//错误
printf("%d\n", strlen(&arr));//6。取整个数组地址,但是指向数组开头
printf("%d\n", strlen(&arr + 1));//随机值
printf("%d\n", strlen(&arr[0] + 1));//5,表示从第二个元素处向后找'\0'
char *p = "abcdef";
printf("%d\n", sizeof(p));//4/8.表示指针变量p所占内存空间的大小
printf("%d\n", sizeof(p + 1));//4/8.表示第二个元素地址所占内存空间的大小
printf("%d\n", sizeof(*p));//1.表示第一个元素所占内存空间的大小
printf("%d\n", sizeof(p[0]));//1.同上
printf("%d\n", sizeof(&p));//4/8.指针变量p的地址所占内存空间的大小
printf("%d\n", sizeof(&p + 1));//4/8.指针变量p的地址的下一个地址所占内存空间的大小
printf("%d\n", sizeof(&p[0] + 1));//4/8.第二个元素的地址所占内存空间的大小
printf("%d\n", strlen(p));//6。p指向首元素地址,并向后找'\0'
printf("%d\n", strlen(p + 1));//5.从第二个元素向后找'\0'
//printf("%d\n", strlen(*p));//错误
//printf("%d\n", strlen(p[0]));//错误
printf("%d\n", strlen(&p));//随机值
printf("%d\n", strlen(&p + 1));//随机值
printf("%d\n", strlen(&p[0] + 1));//5,从第二个元素向后找'\0'
//二维数组
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));//48.表示整个数组所占内存空间的大小
printf("%d\n", sizeof(a[0][0]));//4.表示首元素所占内存空间的大小
printf("%d\n", sizeof(a[0]));//16.表示首行所有元素所占内存空间的大小
printf("%d\n", sizeof(a[0] + 1));
//4/8,a[0]是第一行数组名,并没有单独放在sizeof内部或者取地址。所以+1表示第一行第二个元素地址所占内存空间的大小
printf("%d\n", sizeof(*(a[0] + 1)));//4.表示第一行第二个元素占的内存空间的大小
printf("%d\n", sizeof(a + 1));//4/8.a表示首元素地址,a是二维数组,首元素的地址就是第一行的地址
//所以a表示的是二维数组第一行的地址,+1表示第二行的地址
printf("%d\n", sizeof(*(a + 1)));//16.对第二行的地址解引用,访问到的就是第二行
//*(a+1)->a[1];->sizeof(a[1]),表示第二行数组名
printf("%d\n", sizeof(&a[0] + 1));//4/8. 表示第二行所有元素地址占的内存空间的大小
printf("%d\n", sizeof(*(&a[0] + 1)));//16.表示第二行所有元素占内存空间的大小
printf("%d\n", sizeof(*a));//16.表示首元素就是第一行,第一行占内存空间的大小
//*a->*(a+0)->a[0],->sizeof(a[0])
printf("%d\n", sizeof(a[3]));//16.表示第四行数组名,与第二行第一行类型一样
//int a = 0;
//printf("%d\n", sizeof(a));//4
//printf("%d\n", sizeof(int));//4
//去a处看一下,并没有访问内存,根据int (类型)
return 0;
}
关于sizeof和strlen计算的一些思考+总结
最新推荐文章于 2024-07-24 14:04:23 发布