字符数组
一: 长度混淆
char array[100] = "asd";
cout << sizeof(array) / sizeof(array[0]) <<endl;
cout << strlen(array) <<endl;
char *array2;
cout << sizeof(array2) <<endl;
>>>> 100
>>>> 3
>>>> 8 //指针和数组使用sizeof注意点
> > sizeof 求得空间大小,单位为字节,不受内容的影响;
> >
> > strlen(char*) 求得为实际长度,从首地址开始,直到遇到第一的'\0'为止;
#### 二:定义时混淆
```c++
#include<cstring> // memset
char str1[] = "asd";
char str2[100] = "asd";
char str3[100];
char str4[100];
cin >> str4;//输入为“asd”
memset(str3,'\0',sizeof(str3));
cout << sizeof(str1) << endl;
cout <<sizeof(str2) <<endl;
cout << sizeof(str3) <<endl;
>>>> 3
>>>> 100
>>>> 100
str1[]是动态分配,根据给定的字符串分配空间;
str2[100]静态分配100字节(计算机以字节为单位存储)大小的内存空间,但开辟的空间里内容杂乱,可能为’\0’,也可能为其他内容,若直接进行赋值,则其余空间被初始化为’\0’;
str3[100] 经过初始化,所有空间里的内容均为’\0’;再往str3里输入数据时,可以保证其余空间为’\0’;
str4[100]通过输入赋值,其余空间也是杂乱的内容,并没有对其余空间进行初始化
!!在使用字符数组时要进行初始化memset,此外’ ’ 和 ‘\0’ 表示的意义不同
三:输入输出混淆
char data[100];
memset(data,'\0',sizeof(data));
cin >> data;//输入为"asdf"
cout << data <<endl;
cin >> data[50]; //输入为"asdf"
cout << data[50] << endl;
>>>> asdf
>>>> a
cin >>data 表示向整个data数组里输入字符串,一个字符占一个字节
cin >> data[50] 表示向第五十一个内存里输入字符串,由于一个存储单位为字节,故向一个内存单元里输入一串字符时,取首部一字节的字符放入data[50]中
四:传参定义时混淆
void convert(char num[])//定义函数
{……}
int main()
{
char num[100];
convert(num);//使用函数,传参convert(char* )
return 0;
}
定义函数时要加[],使用时传的参数为char*
五.与字符指针混淆
char str[100] = "asd";
char *p = new char[6];
for(int i = 0; i < 5; i++)
{
*(p+i) = 'a';
}
cout << str << endl;
cout << p << endl;
cout << *p << endl;
cout << &p << endl;
delete[] p;
>>>> asd
>>>> aaaaa
>>>> a
>>>> 0xffffffff(为p的地址)
六.字符指针输出
char num[100] = "asd";
char* p = num;
cout << p << endl;
cout << p+1 << endl;
cout << &p <<endl;
cout << &p+1 << endl;
cout << *p << endl;
cout << *(p+2) endl;
>>>>asd
>>>>sd
>>>>0x61fd98
>>>>0x61fda8
>>>>a
>>>>d
cout <<p; 直接输出指针表示从该地址输出字符串直到遇到’\0’,对于char *p = new char[100];申请的空间为默认内容
&p+1 取p[1]的地址
*§取p地址的内容,p±i表示地址的偏移为i