2015-08-09 91 views
-6

查看C和C++代碼中的用戶輸入(內部for循環)。我們在C++中使用用戶輸入*(p + i),C中使用(p + i)在C中缺少*的原因是什麼? Plz解釋!看看將COMMENT這行......在for循環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++的存在。正如你所看到運營商的參數的類型爲int & 在C++ operator >> int類型的對象聲明如下方式

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

。這意味着該參數通過引用傳遞給該函數,該函數是該函數直接處理該參數而不是其副本。

所以這種說法

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