2013-06-29 80 views
0

我有一个问题,我有一个函数,我不明白具体的东西。功能是:指针函数与数组

int F(int* x , int n){ 
    int i , m=0 
    for (i=0;i<n; i++){ 
     m=x[ i ] + m; 
    } 
    return m * m ; 
} 

我用指针和整数调用函数。后来我做“为”,但我不明白这行:

m=x[ i ] + m; 

由于x是一个指针不是一个数组。

你能帮我吗。

然后x指向内存位置,然后到+1。例如,如果我打电话

n=10 
x=&n 
F(x,n) 

函数返回somenthing奇怪。

X指向位置记忆为n,后来到位置记忆为n + 1?

+2

数组索引对指针类型也起作用 - 数组和指针或多或少可互换 –

+2

** x [i] **等于** \ *(x + i)** –

+0

然后x指向内存位置然后+1。例如,我用n = 10来调用函数,x =&n; F(x,n),函数返回奇异 –

回答

0

数组表示为连续内存,数组变量被解释为指向该内存基址的指针(例如&(x[0]))。数组偏移量语法被转换为指针运算。

参见这篇文章中,其阐明了difference between pointer and arrays

[] - 索引解引用 一个并[b]等于*(A + B)。这意味着a和b必须是一个指向数组元素和整数的指针;不一定分别是因为a [b] == *(a + b)== *(b + a)== b [a]。另一个重要的等价是p [0] == 0 [p] == * p。

的功能可能会被等同宣告(也许会有更为清晰):

int F(int x[], int n); 

,你会调用它像这样:

int data[3] = {1, 2, 3}; 
int value = F(data, 3); 
+0

然后n必须是一个数组?,因为x指向x [0]是n,后来指向*(n + 1),但在那个位置有垃圾? –

+0

是的,就像你在更新的问题中显示的那样,它是“垃圾”。你实际上传递了一个指向单个整数的指针,而不是一个数组(或可以被当作数组的连续内存块)。 'F'打算把'x'作为指向一个存储'int's和'n'的存储块的指针作为该数组的长度。 –

+0

请给我一个例子来调用函数吗? –

0

因为x是一个指针,当你通过数组指向函数,x指向数组的第一个元素。由于数组是连续分配的内存,因此可以使指针指向数组的连续元素。这就是为什么

m=x[i]+m 

X [I]意味着到i个索引从阵列

main() 
{ 
    int x[10]={1,2,3,4,5,6,7,8,9,10},sum; 
    sum=function(x,10); 
    return 0; 
} 

该函数将数组给函数的第一个元素,与图10中,阵列的大小

+0

您可以举一个例子来调用de函数 –

+0

@SergioOvalle:编辑 –