c++ - C & C++ 中数组的动态内存分配

标签 c++ c arrays dynamic-memory-allocation dynamic-arrays

查看 C 和 C++ 代码中的用户输入(在 for 循环内)。我们在 C++ 中的用户输入中使用 *(p+i),在 C 中使用 (p+i)。C 中缺少 * 的原因是什么? 请解释一下!看看 for 循环内的 COMMENT 行...

#include <iostream>

using namespace std;

int main()
{
  int n,i;
  cout << "Ent size" << endl;
  cin>>n;
  int *p = new int [n];
  for(i=0;i<n;i++)
    cin>>*(p+i);//LOOK AT THIS LINE
  cout<<"------------\n\n";
  for(i=0;i<n;i++)
    cout<<*(p+i)<<endl;
  return 0;
}
<小时/>
#include <stdio.h>
#include <stdlib.h>
int main()
{
  int n;
  printf("Ent size!\n");
  scanf("%d",&n);
  int *p=(int *)malloc(n*sizeof(int));
  int i;
  for(i=0;i<n;i++)
    scanf("%d",(p+i));//LOOK AT THIS LINE

  printf("-------\n\n");
  for(i=0;i<n;i++)
    printf("%d\n",(p+i));
  return 0;
}

最佳答案

由于 C++ 中存在引用,因此存在差异。 在 C++ 中 operator >>对于 int 类型的对象,声明方式如下

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

如您所见,运算符的参数类型为 int & 。这意味着参数通过引用传递给函数,即函数直接处理参数而不是其拷贝。

所以这个声明

cin>>*(p+i);

相当于

cin.operator( *( p + i ) );

并且编译器不会创建表达式 *( p + i ) 指定的对象的拷贝。它使用对象本身,因为对象是通过引用传递的。

在 C 中实际上也使用了对参数的引用,但它被指定为指针,因为 C 中没有定义引用的概念。

当有人说一个对象是通过引用传递给 C 中的函数时,这意味着该对象是使用指向该对象的指针间接传递的。 在 C++ 中,这意味着使用了引用的概念。

所以如果你想要这个功能scanf会将输入数据存储在对象本身中,您必须使用指向对象的指针将其间接传递给函数。

scanf("%d",(p+i));

这里p + i是一个指向对象 *( p + i ) 的指针.

考虑这两个简单的程序

C++

#include <iostream>

int main()
{
    int x = 10;
    int &rx = x;

    std::cout << "x = " << std::endl;

    rx = 20;

    std::cout << "x = " << std::endl;
}

在 C 中可以使用指针以如下方式编写相同的内容,因为 C 没有引用的概念

C

#include <stdio.h>

int main( void )
{
    int x = 10;
    int *rx = &x;

    printf( "x = %d\n", x );

    *rx = 20;

    printf( "x = %d\n", x );
}

关于c++ - C & C++ 中数组的动态内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31905067/

相关文章:

android - 将字节数组转换为pdf文件然后保存

c - 忽略空的可变参数

python - Pygame:矩形与同一列表中的其他矩形碰撞

c++ - 检查 COM 指针是否相等

c++ - 将 C API 调用转换为 delphi

c - 外部声明,T* v/s T[]

c - 如何 printf long long

javascript - 数组中奇怪的 javascript 变量行为

c++ - 如何在 Qt 中捕获异常?

c++ - 更改 CLion 中的默认 CMakeLists.txt 以包含警告