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

C++ dynamic memory allocation (char[] and 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;
}

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

char *str = new char[20];

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

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

而在这个地址2是连续地址上的20个字符,所以第一个字符将在地址地址2中,然后是下一个地址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.

运算符重载 <<>> 分别对 const char*char* 有特殊重载,因为它们是 null-terminated C-style 字符串.他们是 处理方式与其他 pointers/other 数组不同。

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

cin >> str;

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

cout << str; 

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


然而,其他指针类型也有这样的语义,例如 int*

cin >> p;

行不通,没有“读取整数数组”或“读取指针”之类的东西,而

cin >> *p; 

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

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。没有读取整数序列的读取功能,因为整数序列不是常见的东西。然而,一个字符序列是一个 c-string 并且是一个典型的东西。这就是为什么 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);

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