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*有特殊的重载,因为它们是以null结尾的C样式字符串。它们是与其他指针/其他数组相比被区别对待。

下面对所使用的语义进行一点比较:

cin >> str;

是指";将以null结尾的字符串读取到数组中,其中str是指向第一个元素"的指针;。

cout << str; 

是指";打印一个以null结尾的字符串,其中str是指向第一个元素"的指针;。


然而,对于int*等其他指针类型也有这样的语义。

cin >> p;

不起作用,不存在";读取int的阵列";,或";读取指针";,而

cin >> *p; 

工作和手段;读取单个整数并将其存储在值CCD_ 14"中;,也就是说,数组中的第一个元素被修改了。

cout << p;

是指";打印指针的值";,再次因为对于int*没有类似于"1"的特殊语义;打印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.的三个对象的分配数组中只使用了一个对象

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

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

也就是说,运算符不仅需要访问数组的第一个字符,还需要使用指针算术访问数组的后续字符。运算符不会更改传递的指针。它会更改指针指向的类型字符的对象。

对于int类型的对象,运算符>gt;像一样声明

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

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

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

char *str = new char[20];

str是一个指针,所以它有:

_地址&str = adress1_值str = adress2(它是地址,因为它是指针(

在这个地址2是连续地址上的20个字符,所以第一个字符将在地址2中,然后是下一个地址2+1,然后是地址2+2等

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

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

例如,strlen就是这样工作的:

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

最新更新