字符数组与指针易错点

本文详细介绍了C++中字符数组在长度、定义、输入输出、函数传参、与指针混淆等方面常见的理解误区,包括sizeof与strlen的区别、未初始化数组的内容、cin与指针的交互方式等,强调了初始化与内存管理的重要性。
摘要由CSDN通过智能技术生成

字符数组

一: 长度混淆
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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值