微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C ++动态内存分配char []和int []

如何解决C ++动态内存分配char []和int []

str一个指针,为什么不使用str进行输入和输出?不是*str
p一个指针,为什么使用*p进行输入和输出?不是p

#include<iostream>
using namespace std;

int main()
{
   
    char* str = new char[20];
    cin>>str;
    cout<<str<<endl;
    delete []str;

    int* p = new int[3];
    cin>>*p;
    cout<<*p<<endl;
    delete []p;

    return 0;
}

解决方法

运算符重载<<>>分别对const char*char*具有特殊的重载,因为它们是以N结尾的C样式字符串。他们是 与其他指针/其他数组的处理方式不同。

以下是所用语义的一些比较:

cin >> str;

表示“将以空终止的字符串读入数组,其中str是指向第一个元素的指针”。

cout << str; 

表示“打印一个以空字符结尾的字符串,其中str是指向第一个元素的指针”。


但是,其他指针类型(例如int*)具有这种语义。

cin >> p;

无法正常工作,而“ p>则不存在”读取整数数组”或“读取指针”之类的东西。

cin >> *p; 

的工作原理是“读取一个整数并将其存储在p的值中”,即数组get中的第一个元素被修改。

cout << p;
同样,

表示“打印指针的值”,因为对于int*没有特殊的语义,如“打印整数数组”。另一方面

cout << *p;

表示“打印一个整数,即p的值”,即打印数组中的第一个元素。

,
char* str = new char[20];
cin>>str;

您正在将指向一系列字符的指针传递给cin,因为预计cin会在指针指向的位置读取多个字符。

int* p = new int[3];
cin>>*p;

您通过引用将单个int传递给cin,因为期望cin读取单个int。没有读取功能可以读取一个int序列,因为一个int序列并不常见。但是,char序列是c字符串,很典型。这就是cin具有读取char指针的重载的原因。

,

最好重写此代码段

int* p = new int[3];
cin>>*p;
cout<<*p<<endl;
delete []p;

喜欢

int* p = new int;
cin>>*p;
cout<<*p<<endl;
delete p;

因为分配的三个int类型对象的数组中仅使用了一个对象。

在第一种情况下,您要处理一个接受或存储字符串的字符数组。例如,对于字符数组,运算符>>声明为

template<class charT,class traits>
basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&,charT*);

那是操作员需要使用指针算法不仅要访问数组的第一个字符,还要访问数组的后续字符。操作员不会更改传递的指针。它将更改指针指向的字符类型的对象。

对于int类型的对象,运算符>>声明为

basic_istream<charT,traits>& operator>>(int& n);

通过引用传递标量对象以使用运算符对其进行更改就足够了。

,

因为指针是一个变量,其值是一个地址,所以*运算符可以访问所指向的地址的值。 例子:

char *str = new char[20];

str是一个指针,因此具有:

_地址&str = adress1 _值str = adress2(它是地址,因为它是一个指针)

在这个地址2上,连续的地址是20个字符,因此第一个字符将是地址adress2,然后是下一个地址2 + 1,然后是地址2 + 2,等等。

,

假设项目符号1中有语法错误。

  1. str是指向char的指针,但在这种情况下,它指向此类数组中的第一个。 *str是对单个字符(字节)的引用。指针可用于通过传递数组开头的地址来传递字符串。我们保证能够增加该指针并取消对其的引用,以便访问以下字符

例如strlen可能是这样的:

  size_t strlen(char *p)
  {
    size_t len = 0;
    while (*p++ != 0) len ++;
    return len;
  }
  1. p是指向int的指针的值,对其进行写入没有任何意义。 *p引用类型为int的数组的第一个元素。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。