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只求大小,不访问。