您的位置:首页 > 编程语言 > C语言/C++

C++笔试、面试、基础问题笔记

2017-09-19 11:21 381 查看
一、sizeof和strlenstrlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'/0'为止,然后返回计数器值。1.
char* p = new char[100];//sizeof(p)的结果为4
int* p = new int[100];//sizeof(p)的结果也为4
2.
char D1[23];//sizeof(D1)为23
int D2[23];//sizeof(D2)为92(23*4)
注意:sizeof()得到的分配的内存的字节数,和是否使用无关,例如,char a[8]={'a','b'},则sizeof(a)的值仍为8。3.
char ss[] = "0123456789";
sizeof(ss) 结果 11 ===》ss是数组,计算到/0位置,因此是10+1
4.
char str0[8] = { 'a', 'b', 'c', 'd', 'e', 'f', 'i', 'g' };
char str1[] = "abcdefig";
cout << strlen(str0) << endl;//因为没有 /0 结尾,所以strlen的返回不可知
cout << sizeof(str0) << endl;//结果为8
cout << strlen(str1) << endl;//结果为8
cout << sizeof(str1) << endl;//结果为9,会自动加/0结尾
由以上知,strlen计算的是实际值,而sizeof是实际值+1
int a[] = { 1,2 };
cout << sizeof(a) << endl;//结果为8
char str2[] = "01234/056789";char str3[] = "abcse/0fgkij";cout << strlen(str2) << endl;//结果为12cout << strlen(str3) << endl;//结果为12
总结:动态分配的数组不能用sizeof()来确定数组的字节大小。二、menset()函数函数原型是:void *memset(void *s, int ch, size_t n);首先menset()是以字节为单位对初始化空间进行初始化的。所以说,对于char类型可初始化为任意值,而整形数组只能初始化为'\0'也就是NULL,ASCII码值为0.(数字 0的ASCII码值为48,A为65,a为97)。
memset(iBuf, 48, sizeof(char)* 10);  //ibuf为char类型,则把内存置为0
如下例子,
// 对整型数组进行初始化int iBuf[10];memset(iBuf, 0, sizeof(int)* 10);for (int i = 0; i < 10; ++i){cout<< iBuf[i];}
输出结果为 0000000000
// 对字符型数组进行初始化char iBuf[10];memset(iBuf, 0, sizeof(char)* 10);  //for (int i = 0; i < 10; ++i){cout<< iBuf[i];}
输出结果为 空,若改为cout<<(int)iBuf[i];则结果为 0000000000
// 对字符型数组进行初始化char iBuf[10];memset(iBuf, 65, sizeof(char)* 10);  //for (int i = 0; i < 10; ++i){cout<< iBuf[i];}
输出结果为 AAAAAAAAAA 若改为cout<<(int)iBuf[i];则结果为65656565656565656565
上面的例子之所以没有出错就是因为初始化为0(指ASCII码值为0,即NULL),但是如果初始化为1,那么因为int一般是4个字节,那么相当于将一个int元素初始化成了00000001 00000001 00000001 00000001,这样对于一个int元素肯定不是1,而是一个很大的数,结果出乎意料。即当memset(, 0 ,)时,对于字符型置为NULL,对于整形则置为0。
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++