字符数组与指针易错点

字符数组

一: 长度混淆

char array[100] = "asd";
cout << sizeof(array) / sizeof(array[0]) <>>> 100 
>>>> 3
>>>> 8 //指针和数组使用sizeof注意点

> > sizeof 求得空间大小,单位为字节,不受内容的影响;
> >
> > strlen(char*) 求得为实际长度,从首地址开始,直到遇到第一的'\0'为止;

#### 二:定义时混淆

```c++
#include // 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 <>>> 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 <> 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 <>>>asd
>>>>sd
>>>>0x61fd98
>>>>0x61fda8
>>>>a
>>>>d

cout <

&p+1 取p[1]的地址

*§取p地址的内容,p±i表示地址的偏移为i

你可能感兴趣的:(c++,数据结构,开发语言)