【问题标题】:C++ dynamic memory allocation (char[] and int[])C++ 动态内存分配(char[] 和 int[])
【发布时间】:2020-08-14 12:37:55
【问题描述】:

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;
}

【问题讨论】:

  • 什么?你在问什么?还有两个bug,delete x;都应该是delete[] x;或者内存处于未定义状态
  • 我想知道str*str的区别。
  • 指针和对象分别指向 。这里有什么困惑。?
  • 对于char *const char*,您始终必须使用流对象except 取消引用*p 之类的点。流类具有专门设计用于处理这些的特殊函数,用于读取和写入以空字符结尾的字符串。

标签: c++ char int operator-overloading new-operator


【解决方案1】:

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

这里是使用的语义的一点比较:

cin >> str;

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

cout << str; 

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


但是对于其他指针类型,例如int*,也有这样的语义。

cin >> p;

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

cin >> *p; 

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

cout << p;

再次表示“打印指针的值”,因为int* 没有像“打印整数数组”这样的特殊语义。另一方面

cout << *p;

意思是“打印一个整数,即p的值”,即打印数组中的第一个元素。

【讨论】:

    【解决方案2】:
    char* str = new char[20];
    cin>>str;
    

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

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

    您通过引用将单个 int 传递给 cin,因为 cin 预计会读取单个 int。没有读取功能可以读取 int 序列,因为 int 序列不是常见的事情。但是,char 序列是一个 c-string 和一个典型的东西。这就是为什么 cin 有一个读取 char 指针的重载。

    【讨论】:

      【解决方案3】:

      最好重写这段代码sn-p

      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);
      

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

      【讨论】:

        【解决方案4】:

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

        char *str = new char[20];

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

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

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

        【讨论】:

          【解决方案5】:

          假设项目符号 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

          【讨论】:

            猜你喜欢
            • 2015-09-25
            • 1970-01-01
            • 2017-08-27
            • 1970-01-01
            • 1970-01-01
            • 2013-01-25
            • 2011-06-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多