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)
由于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)