1、sizeof和strlen有哪些区别?
区别如下:
(1)sizeof是操作符,strlen是函数。
(2)sizeof操作符的结果类型是size_t,它在头文件中typedef为unsignedint类型,该类型保证能容纳实现所建立的最大对象的字节大小。
(3)sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以“\0”结尾的。
(4)数组做sizeof的参数不退化,传递给strlen就退化为指针了。
(5)sizeof在编译的时候已经计算完毕了,所以sizeof可以测数据类型,strlen的结果在运行的时候计算,而且只是用来计算字符串长度,不能计算类型长度。
(6)sizeof后如果是类型,必须加括弧,如果是变量名,可以不加括弧。
(7)在计算字符串数组的长度上有区别。例:
[cpp] view plain copy
char str[20] = "0123456789";
int a = strlen(str);
int b = sizeof(str);
a计算的是字符串的长度,为10
b计算的str【20】的内存空间,为20
(8)如果要计算指针指向的字符串长度,必须使用strlen
2、使用sizeof计算联合体的大小
#include <iostream>
union u
{
double a;
int b;
};
union u2
{
char a[13];
int b;
};
union u3
{
char a[13];
char b;
};
int main()
{
cout<<sizeof(u)<<endl;
cout<<sizeof(u2)<<endl;
cout<<sizeof(u3)<<endl;
return 0;
}
联合体的大小取决于它所有的成员中占用空间最大的一个成员的大小,并且对于复合数据类型,如union、struct、class的对齐方式为成员中最大的成员对齐方式。
对于u,最大的是double a,所以sizeof(u) = sizeof(double) = 8
对于u2,最大的是char[13],这里要注意,由于另一个int b的存在,u2 的对齐方式变为4,也就是说,占用的空间会是一个4的倍数,大于13并最接近13的4的倍数就是16了
对于u3,最大的空间是char[13],sizeof(u3) = 13
结果:
8
16
13
3、#pragma pack的作用 看代码写输出
#include <iostream>
using namespace std;
#pragma pack(1)
struct test{
char c;
short s1;
short s2;
int i;
};
int main()
{
cout<<sizeof(test)<<endl;
return 0;
}
#pragma pack(1)的作用就是将对齐方式设为1,sizeof(test) = 1 + 2 + 2 + 4 = 9
4、用指针赋值 看代码写输出
#include <stdio.h>
int main()
{
char a[] = "hello, world";
char *pstr = a;
printf("%c\n", *(pstr+4));
printf("%c\n", pstr[4]);
printf("%c\n", a[4]);
printf("%c\n", *(a+4));
*(pstr+4) += 1;
printf("%s\n", a);
return 0;
}
这里其实很简单,第6行中将字符串a首地址赋给pstr,之后pstr就指向了字符串a,8~11行其实都是输出“hello,world”中的第5个字母,即‘o’。 第13行中,去字符串的第四个字母,将其自加一,o的ascall加1即为p,所以14行输出“hellp,world”。 输出:
o
o
o
o
hellp, world
5、指针加减操作 看代码,写输出
#include <stdio.h>
int main()
{
int a[5] = {1,2,3,4,5};
int *ptr = (int*)(&a+1);
printf("%d\n", *(a+1));
printf("%d\n", *(ptr-1));
return 0;
}
这题主要就是a和&a的理解了,首先将a[5]看成分散的元素,a就是数组首元素地址,第8行输出的是数组首元素地址加一的数,即a[1] 2。 然后就是第6行的理解了,这个时候把a数组看成一个整体,&a表示取这个数组的地址,数组在内存中是线性分布的,&a+1就是这个数组最后一个元素之后的地址,ptr-1指向的就是a数组的最后一个元素。
输出:
2
5