2015-08-09 4 views
-6

Посмотрите на пользовательский ввод в коде C и C++ (внутри цикла for). Мы используем * (p + i) для ввода пользователем в C++ и (p + i) в C. В чем причина отсутствия * в C? Plz объясните! Посмотрите на COMMENT линии ... внутри для циклаДинамическое выделение памяти массива в C & C++

#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; 
} 
+4

Почему вы ожидаете, что они будут такими же ???? 'scanf' и' std :: cin' - это не одно и то же. – mathematician1975

+0

И в Python вы пишете 'array [i] = input()' (да, это не совсем то же самое). Так в чем смысл? Различные языки имеют разные способы выполнения определенной задачи. – Olaf

+0

Если вы написали эти обращения к массиву, как здравомыслящий человек, C++ будет 'cin >> p [i];' и C будет 'scanf ("% d ", &p[i]);'. Код C++ ожидает объект и C функция ожидает адрес. – Blastfurnace

ответ

5

Разница существует из-за наличия ссылок на C++. В C++ operator >> для объектов типа Int объявлен следующим образом

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

Как вы видите параметр оператора имеет тип int &. Это означает, что аргумент передается функции по ссылке, которая является функцией, непосредственно связанной с аргументом, а не с его копией.

Так это утверждение

cin>>*(p+i); 

эквивалентно

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

и компилятор не создает копию объекта, указанного выражением *(p + i). Он использует сам объект, потому что объект передается по ссылке.

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