关于c语言指针和地址问题

定义一个函数:
int tiltang(float *x0, float *y0, float *xt, float *yt, int npoint, float * theta, int * iarea, float arealim);
int tiltang(float *x0, float *y0, float *xt, float *yt, int npoint, float * theta, int * iarea, float arealim)

...x0[i]...


然后在另一个函数调用它时:
float x[n],y[n],xs[n],ys[n];
int n,iarea;
float thetaf, arealim;
tflag = tiltang(x,y,xs,ys,n,&thetaf,&iarea,arealim);

这里前四个变量前为什么不加&,而&thetaf?前四个变量是指向数组的指针吗?怎么可以这么用:x0[i]

还有一个问题我怎么在同一个.c文件里的多个函数共用一个变量,这个变量有个初始值,初始值是访问这个文件时外面输入的,而且所有函数都能改变这个变量值

如何定义一个函数返回一个数组?

具体点,谢谢啦

针对第一个问题:
&是取地址符号,数据在计算机中存储,有相应的地址能够找到.
数组头部就相当于一个指针,如果float x[n],那么x代表着数组中的首地址,由于数组在内存占用的是连续存储空间.因此也可以用指针去得到它的数据.
你调用数组的时候,其实也就是传递数组的首地址给函数,那么就不需要&符号了.然而你想传递thetaf,这个thetaf只是个数据,想在函数中改变它的值,那么可以通过得到数据的地址,在地址中改变数据.

第二个问题
同上面回答,可以采用一个全局变量,也就是定义在函数外面的变量,最好在.C文件开始的地方.

第三个问题:
返回一个数组即返回它的首地址就可以了,如果你能够了解到计算机数据在内存中的排列,那么这个概念就非常容易理解.(浮点数和整数一样,在内存中占用4个字节,
#include <stdio.h>
float * SumArray(float *x, float *y,int len) {
float *sum;
int i = 0;
for(i=0;i<len;i++) {
sum[i] = x[i] + y[i]; //*(sum+i) = *(x+i) + *(y+i);
}
return sum;//这里返回的是sum数组的首地址,你可以把sum理解为一个指针的地址,也可以理解为一个数组的首地址.请注意(*sum和sum[0]的地址是一样的,sum是sum[n]的首地址),如果你能区分出这个概念,指针也是小case了.
}

int main() {
float x[10],y[10];
float *sum;//float sum[10];
int i = 0;
for(i=0;i<10;i++) {
x[i] = i;
y[i] = i*10;
printf("%f\t%f\n",x[i],y[i]);
}
sum = SumArray(x,y,10);//将返回的传递给sum指针,或者所让sum指向数组返回的地址
for(i=0;i<10;i++) {
printf("%f\n",sum[i]);
}
printf("%d",sizeof(float));//查看浮点数在电脑中占用的字节
return 0;
}
通过函数,可以返回一个数组,我已经调试通过.你也可以在你的电脑上调试这段程序,加深理解,

PS:如果觉得我的答案能回答你的问题,请采纳,谢谢~追问

这段代码我是要在python中用,这个函数返回的数组相当于一个地址,我怎么在python用啊

追答

抱歉我对python这个语言不熟悉,帮不上你的忙了..

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-08
指针是用来保存地址的,&是取地址的意思。 int a; &a就是取整数a的地址。

然后数组是会有若干个元素,数组在内存中是连续存在的,所以,数组名就是首地址,可以节省一个取地址运算符。
int a[10] 数组名a就是数组a的首地址
第2个回答  2011-12-08
&thetaf,&iarea,首先弄清,引用的意思:相当于重命名,也就是A,你给他重新取了个名字叫B,你对B做了什么事情,也就相当于对A做了什么事情。
前四个不加是因为,函数里只是需要这个变量的一个值,而不对这个变量进行修改。(刚刚看错,&thetaf,&iarea是将变量地址拷贝给指针取用(和引用差不多功效),而前面的只是简单复制。)

可以使用全局变量。

void GetArray( int* &pArray, int count)
{
//..前期处理
//...
pArray = new int[count];
//pArray = (int*) malloc(count*sizeof(int));
}追问

前四个也对数组的值修改了,
&我记得我学的时候是取的内存地址

追答

那个,我括号之前的回答,不是说明这个问题的。
这里前四个变量前为什么不加&(数组名作为参数,传的值就是一个地址)
而&thetaf?(要取地址赋值给指针)
前四个变量是指向数组的指针吗?(应该说是指向数组首地址的指针)
怎么可以这么用:x0[i](指针和数组有一些共性)

追问

好像记起来了,~~
就上面那个函数,我做成一个.so文件,在python中调用,输入的变量可以使list吗?
比如那个文件名叫example.c
编译成example.so
import example
有一个list:a[],
我能这样用吗:
example.tiltang(a[],...)

追答

刚睡醒。
如果做成一个.SO文件,还是建议,在哪儿分配的空间在哪儿释放吧。
给数组里赋值倒没什么。O(∩_∩)O~,如果觉得回答可以,望采纳。

相似回答