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

ank*_*oor -6 c c++ arrays dynamic-memory-allocation dynamic-arrays

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

#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;
}
Run Code Online (Sandbox Code Playgroud)
#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;
}
Run Code Online (Sandbox Code Playgroud)

Vla*_*cow 5

由于C++中存在引用,存在差异.在C++ operator >>中,int类型的对象以下面的方式声明

basic_istream<charT,traits>& operator>>(int& n);
Run Code Online (Sandbox Code Playgroud)

如您所见,运算符的参数具有类型int &.这意味着参数通过引用传递给函数,该函数直接处理参数而不是其副本.

所以这句话

cin>>*(p+i);
Run Code Online (Sandbox Code Playgroud)

相当于

cin.operator( *( p + i ) );
Run Code Online (Sandbox Code Playgroud)

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

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

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

因此,如果您希望该函数scanf将输入数据存储在对象本身中,则必须使用指向该对象的指针将其间接传递给该函数.

scanf("%d",(p+i));
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

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 );
}
Run Code Online (Sandbox Code Playgroud)