查看 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/