boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 其实到今天也没真正搞懂数组参数的传递问题
相关主题
数组问题
怎么得到char *分配空间的大小?
在matlab中如何运行不在current working directory中的script?
what does this mean?
用什么算法能减少这个循环里的运算量?
也问个二维数组的函数传递问题
搞不定,不得不问,一维数组跟二维数组的问题
free(char *)的问题 (转载)
大家看看这个简单的qsort排序的问题
再问一个free()的问题
相关话题的讨论汇总
话题: 地址话题: data2话题: 数组话题: int话题: idx
进入Programming版参与讨论
1 (共1页)
s******e
发帖数: 2181
1
基本道理清楚,数组作为参数传递给函数的只是数组首元素的地址,函数在需要用到后
面元素时再按照这个地址和数组下标去查找。同时,数组名又正好是数组首元素的地址
,所以在主函数里调用子函数时只需写数组名,那么首元素的地址就传出去了。
我的问题来了,如下例,被调用的函数multiply的形参部分,float *p说明p是一个地
址,这个地址就是传过来的数组首元素的地址。既然p只是地址,那后面的操作
p[0]=2*p[0]
p[1]=2*p[1]
p[2]=2*p[2]
...
不是在把地址乘以2吗,怎么就变成把地址里面的内容乘以2了?用*p[...]来操作是不
是更符合情理?而且p既然是一个地址,怎么就可以写成p[...]了呢,这不变成地址数
组了吗?
虽然实际当中都在这样写,但心中的困惑一直都在。我不是专业马工,求专业马工解惑
并轻拍。
main()
{
float num[]={2.0,3.1,8.6,4.1,7.9};
const int size=sizeof(num)/sizeof(int);
multiply(num,size);
...
}
void multiply(float *p,int size)
{
int idx=threadIdx.x;
if (idx p[idx]=2*p[idx];
}
d****i
发帖数: 4809
2
Simple rule: For array, using index is equivalent to dereferencing:
a[i] == *(a+i)
You increment a's address by offset i and load the value from memory (that'
s why array's index always starts from 0 for all computer programming
languages)

【在 s******e 的大作中提到】
: 基本道理清楚,数组作为参数传递给函数的只是数组首元素的地址,函数在需要用到后
: 面元素时再按照这个地址和数组下标去查找。同时,数组名又正好是数组首元素的地址
: ,所以在主函数里调用子函数时只需写数组名,那么首元素的地址就传出去了。
: 我的问题来了,如下例,被调用的函数multiply的形参部分,float *p说明p是一个地
: 址,这个地址就是传过来的数组首元素的地址。既然p只是地址,那后面的操作
: p[0]=2*p[0]
: p[1]=2*p[1]
: p[2]=2*p[2]
: ...
: 不是在把地址乘以2吗,怎么就变成把地址里面的内容乘以2了?用*p[...]来操作是不

r******l
发帖数: 10760
3
p是地址,但p[..]就已经不是了啊。
s******e
发帖数: 2181
4
谢谢解惑,我的问题是这样的,这是一个被我简化后的在matlab环境下运行的C程序。
我想测试我输入的数据是否被正确读入。一个途径是通过把输入参数赋给输出的地址,
来得到结果,看来是正确的。另一个是通过printf把输入数据直接打出来,可是这个打
出来的数字始终为0,无论采用printf("input=%dn", data2[0]); 还是printf("input=
%dn", *data2);都一样。真是见鬼了,那data2这个地址上存的数据到底是什么
#include "mex.h"
#include "gpu/mxGPUArray.h"
#include "cuda.h"
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, mxArray const *prhs[])
{
double *data1; *data2;
int m,n;
m=mxGetM(prhs[0]);
n=mxGetN(prhs[0]);
plhs[0]=mxCreateDoubleMatrix(m,n,mxREAL);

data1=mxGetPr(prhs[0]);
data2=mxGetPr(plhs[0]);
data2[0]=data1[0];
printf("input=%dn", data2[0]);
}

that'

【在 d****i 的大作中提到】
: Simple rule: For array, using index is equivalent to dereferencing:
: a[i] == *(a+i)
: You increment a's address by offset i and load the value from memory (that'
: s why array's index always starts from 0 for all computer programming
: languages)

s******e
发帖数: 2181
5
hi你好,我把我的确切问题更新在3楼了。
为什么通过plhs输出的结果,跟直接用printf打印出来的结果会不同呢?我data2[0]的
写法有错吗?

【在 r******l 的大作中提到】
: p是地址,但p[..]就已经不是了啊。
1 (共1页)
进入Programming版参与讨论
相关主题
再问一个free()的问题
func调用结束时出错
看下这个小程序
10个数所有的组对可能, 怎么解?
char s[]和char *ps的不同
我也来个。某公司招初级C程序员的面试题。[转载]
呼叫THRUST等C语言牛牛,菜鸟级C语言指针问题
unsigned long long
C 语言,初学者,简单问题
c的问题
相关话题的讨论汇总
话题: 地址话题: data2话题: 数组话题: int话题: idx