2015-08-08 56 views
-1

請通過下面的循環:添加指針

我對第一循環特別迷茫,

第一環:

for(i = 0; i < n; i++) 
{ 
    scanf("%d", ptr + i); 
} 
for(i = 0; i < n; i++) 
{ 
    sum = sum + (*(ptr + i)); 
} 

第二環:

int *x ; 
for(i = 0; i < n; i++) 
{ 
    x = ptr + sizeof(i); 
    scanf("%d",x); 
} 
for(i = 0; i < n; i++) 
{ 
    x = ptr + sizeof(i) ; 
    sum = sum + (*x); 
} 

爲什麼使用malloc 使用上述循環輸入數組中的元素g同樣的結果? 爲什麼第一個和第二個循環給出相等或正確的結果?

爲什麼(ptr + i)和ptr + sizeof(i)在相同的waY中工作?

整個程序

#include<stdio.h> 

#include<conio.h> 

#include<stdlib.h> 

#define NULL 0 

int main() 

{ 
    int *ptr; 
    int i, n, sum = 0 ; 
    float avg ; 
    printf("Enter the number of elements you want to store in the array."); 
    scanf("%d", &n); 
    ptr = (int *) malloc(n * sizeof(int)) ; /*Dynamic Memory allocation*/ 
    if(ptr == NULL) 
    { 
     printf("The required amount of memory is not available. "); 
     getch(); 
     exit(0);                    
    } 

    else 
     { 
     printf("Enter the elements\n"); 
     for(i = 0; i < n; i++) 
      { 
       scanf("%d", ptr + i); 
      } 
     for(i = 0; i < n; i++) 
      { 
       sum = sum + (*(ptr + i)); 
      } 

     printf("\nThe sum of %d elements entered is = %d",n , sum); 
     avg = sum/n ; 
     printf("\nThe average of %d number of the array is %f", n, avg); 
     } 

     printf("\n"); 
     getch(); 

} 
+2

如何聲明'ptr'? – lurker

+0

'x'被聲明爲'int',並且您試圖對其進行解引用。 – mathematician1975

+0

int * x; 對不起,我沒有進入整個程序 –

回答

4

爲什麼(PTR + i)和PTR +的sizeof(i)以同樣的方式工作?

他們不是。在第一個示例中,您將n值讀入數組中(將它們存儲在連續的元素中),然後添加這些n值。在第二個示例中,您讀取的值爲n,並將它們全部存儲在數組的相同的元素中(覆蓋前一元素),因此最終得到的數組大多數是未初始化的,但有一個元素設置爲最後一個值讀。然後,您將該元素添加到自身n次。

所以你可能結果在這兩種情況下相同的總和(例如,如果你的數字是1,3,2),或者你可能不會。

+0

但爲什麼是ptr +我在正確的位置加載元素?是不是ptr應該存儲的地址,並沒有ptr +我意味着地址增加了i倍? –

+0

因爲'ptr + i'計算數組的第i個元素的地址。所以'*(ptr + i)'和'p [i]'是一樣的。這與'i次增加的地址'是一樣的 - 增加相當於多次遞增。 –

+0

非常感謝你:) –