对象所占的内存大小

1、计算各种类型的大小

# include <stdio.h>

# include <stdlib.h>

int main()

{

printf("char类型的大小是:       %d\n", sizeof(char));

printf("short类型的大小是:      %d\n", sizeof(short));

printf("int类型的大小是:        %d\n", sizeof(int));

printf("long类型的大小是:       %d\n", sizeof(long));

printf("long long类型的大小是:  %d\n", sizeof(long long));

printf("float类型的大小是:      %d\n", sizeof(float));

printf("double类型的大小是:     %d\n", sizeof(double));

printf("long double类型的大小是:%d\n", sizeof(long double));

system("pause");

return 0;

}

输出为:

 

 

2、计算整形数组相关值的大小

#define _CRT_SECURE_NO_WARNINGS 1

# include <stdio.h>

# include <stdlib.h>

int main()

{

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

printf("%d\n", sizeof(a));//16;输出整个数组的元素的类型大小

printf("%d\n", sizeof(a + 0));//4;输出第一个元素的地址的类型大小

printf("%d\n", sizeof(*a));//4;输出第一个元素的值的类型大小

printf("%d\n", sizeof(a + 1));//4;输出第二个元素的地址的类型大小

printf("%d\n", sizeof(a[1]));//4;输出第二个元素的值的类型大小

printf("%d\n", sizeof(&a));//4;输出整个数组a的地址的类型大小

printf("%d\n", sizeof(&a + 1));//4;输出数组a后的另一个数组的地址的类型大小

printf("%d\n", sizeof(&a[0]));//4;输出数组第一个元素的地址的类型大小

printf("%d\n", sizeof(&a[0] + 1));//4;输出数组第二个元素的地址的类型大小

system("pause");

return 0;

}

输出为:

 

注:输出指针的类型大小,即是输出指针的类型大小。在32位的平台上指针的类型大小是4个字节,64位的平台上是8个字节

 

3、计算字符数组相关值的大小

 

#define _CRT_SECURE_NO_WARNINGS 1

# include <stdio.h>

# include <stdlib.h>

int main()

{

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

printf("%d\n", sizeof(arr));//6;输出整个数组的元素的类型大小

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;输出整个数组地址后的另一个数组元素的地址的类型大小

printf("%d\n", sizeof(&arr[0] + 1));//4;输出第二个元素的地址的类型大小

system("pause");

return 0;

}

输出为:

 

 

4、计算数组中存放字符串的相关值的类型大小

#define _CRT_SECURE_NO_WARNINGS 1

# include <stdio.h>

# include <stdlib.h>

int main()

{

char *p = "abcdef";

printf("%d\n", sizeof(p));//4;输出字符串的第一个元素的地址的类型大小

printf("%d\n", sizeof(p+1));//4;输出第二个元素的地址的类型大小

printf("%d\n", sizeof(*p));//1;输出第一个字符a的类型大小

printf("%d\n", sizeof(p[0]));//1;输出第一个字符a的类型大小

printf("%d\n", sizeof(&p));//4;输出指针p的地址的类型大小

printf("%d\n", sizeof(&p + 1));//4;输出指针p地址后面的另一个字符的类型大小

printf("%d\n", sizeof(&p[0] + 1));//4;输出第二个元素的地址的类型大小

system("pause");

return 0;

}

输出为:

 

 

5、二维数组的类型大小

#define _CRT_SECURE_NO_WARNINGS 1

# include <stdio.h>

# include <stdlib.h>

int main()

{

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

printf("%d\n", sizeof(arr));//48;整个数组的类型大小

printf("%d\n", sizeof(arr[0][0]));//4;第一个元素的类型大小

printf("%d\n", sizeof(arr[0]));//16;第一行元素的类型大小

printf("%d\n", sizeof(&arr[0]+1));//4;第二行地址的类型大小

printf("%d\n", sizeof(arr+1));//4;第二行地址的类型大小

printf("%d\n", sizeof (arr[0]+1));//4;第一行第二个元素的类型大小

printf("%d\n", sizeof(*arr));//16;第一行元素的类型大小

printf("%d\n", sizeof(arr[3]));//16;第四行元素的类型大小(sizeof只求大小,不访问)

system("pause");

return 0;

}

输出为:

 

注:

1、二维数组的将次:当数组名(arr)或arr[]加 数字时(其前面没有地址符&),arr(代表整个数组)降为arr[0](表示第一行),

arr[](代表行)降为arr[][](表示某行某列的元素)。

2、sizeof只求大小,不访问。

 

6、求字符数组的字符串长度

#define _CRT_SECURE_NO_WARNINGS 1

# include <stdio.h>

# include <stdlib.h>

# include <string.h>

int main()

{

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

printf("%d\n", strlen(arr));//随机数19;因为不确定'\0'字符的位置

printf("%d\n", strlen(arr + 0));//随机数19;因为不确定'\0'字符的位置

    printf("%d\n", strlen(*arr));//error,因为字符'a'(97)不是有效地址

    printf("%d\n", strlen(arr[1]));//error,因为字符'b'(98) 不是有效地址

printf("%d\n", strlen(&arr));//随机数19;从整个数组的地址找,即从第一个字符往后找,与1、2相同

printf("%d\n", strlen(&arr + 1));//随机数13;从整个数组的地址后面找'\0',而数组的字符长度为6,即:19-6=13

printf("%d\n", strlen(&arr[0] + 1));//随机数18;从第二个元素的地址后面找‘\0’,即:19-1=18

system("pause");

return 0;

}

输出为:

 

注:sizeof()求的是一个数的类型大小,即:开辟的空间大小;strlen()求的是字符串长度,以'\0'作为结束标志,函数参数要接一个有效地址。

 

7、求字符串数组的字符串长度

#define _CRT_SECURE_NO_WARNINGS 1

# include <stdio.h>

# include <stdlib.h>

int main()

{

char *p = "abcdef";

printf("%d\n", strlen(p));//6;从第一个元素开始,输出字符串的长度为6

printf("%d\n", strlen(p+1));//5;从第二个元素开始,输出的字符串长度为5

//printf("%d\n", strlen(*p));//error,因为字符'a'(97)不是有效地址

//printf("%d\n", strlen(p[0]));//error,因为字符'b'(98)不是有效地址

printf("%d\n", strlen(&p));//3;随机数,从指针p的地址中找'\0',但是不确定能找到

printf("%d\n", strlen(&p + 1));//11;从指针p地址后面找'\0',但是不确定能找到

printf("%d\n", strlen(&p[0] + 1));//5;从第二个元素开始,输出字符串长度为5

system("pause");

return 0;

}

输出为:

 

 

注释:

A、数组的元素的存放——连续存储。

B、数组的数组名其实是数组首元素的地址。数组名代表整个数组的时候只有两种情况:

第一、sizeof(数组名),这里的数组名表示整个数组。

第二、&数组名,这里的数组名表示整个数组。

C、在32位的平台上指针的大小是4个字节,64位平台是8个字节。

D、sizeof()求的是一个数的类型大小,即:开辟的空间大小;strlen()求的是字符串长度,以'\0'作为结束标志,函数参数要接一个有效地址。

E、二维数组的将次:当数组名(arr)或arr[] 加 数字时(其前面没有地址符&),arr(代表整个数组)降为arr[0](表示第一行),

arr[](代表行)降为arr[][](表示某行某列的元素)。

F、sizeof只求大小,不访问

 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值