2015-08-08 72 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

非常感谢你:) –