如何解决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中有语法错误。
-
str
是指向char的指针,但在这种情况下,它指向此类数组中的第一个。*str
是对单个字符(字节)的引用。指针可用于通过传递数组开头的地址来传递字符串。我们保证能够增加该指针并取消对其的引用,以便访问以下字符
例如strlen
可能是这样的:
size_t strlen(char *p)
{
size_t len = 0;
while (*p++ != 0) len ++;
return len;
}
-
p
是指向int的指针的值,对其进行写入没有任何意义。*p
引用类型为int
的数组的第一个元素。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。