C语言怎么让“函数”返回“指针数组”
如题:例如:有一个函数叫“foo()”int*foo(){int*a[10];.........return????;}又该怎么在主函数main中用这个函数呢?intma...
如题:
例如:有一个函数叫“foo()”
int* foo()
{
int* a[10];
... ... ...
return ????;
}
又该怎么在主函数main中用这个函数呢?
int main(int argc, char* [])
{
... ... ...
int* tempA[10];
tempA = foo(); // ????????
... ... ...
}
“问号的地方”是不懂的,希望各位能说的尽量简明一些
非常感谢!
函数声明那里漏写啦一个*,应该是int ** foo() 展开
例如:有一个函数叫“foo()”
int* foo()
{
int* a[10];
... ... ...
return ????;
}
又该怎么在主函数main中用这个函数呢?
int main(int argc, char* [])
{
... ... ...
int* tempA[10];
tempA = foo(); // ????????
... ... ...
}
“问号的地方”是不懂的,希望各位能说的尽量简明一些
非常感谢!
函数声明那里漏写啦一个*,应该是int ** foo() 展开
8个回答
展开全部
你好
从问题来看,似乎你对于指针的概念没太理解。指针变量中存储的是内存中的地址,而实际的数据放在这个地址中。
按照这段代码来说,int* 声明的指针指向内存中的一块地址,而在这块地址中存储着一个整形数值。所以要返回这样的值,也就相当于是返回一个内存地址。因此,在程序中有两种具体的解决办法:
1.在调用函数的时候,直接将变量的指针(即内存地址)作为参数传入,在函数执行的时候,就会自动对内存中相应地址的数据进行操作。使用这种方法也就不需要返回值了。具体到这段代码中,就是在Main中声明int* tempA[10],把foo函数声明为void foo(int* a[10]),调用时用foo(tempA),在foo函数中直接使用a[10]即可。
2.直接把内存地址作为返回值,因为在C中,数组名就是数组首元素的指针,因此直接返回数组名就可以了,即return a即可。如果是普通变量,要用取内存地址的运算符&,比如声明了整型变量 int i,就可以return &i。这与printf函数中的使用方法是相通的。
【按照补充的内容:】
a-------->a1-------->i1
|-------->a2-------->i2
|……………………
|-------->an-------->im
这样的调用方法,只能保证a1-an不被修改,怎么保证i1-im不被修改?
希望以上回答能帮到你。【PS.很久没用C了,如果哪里出了差错,请指正。】
从问题来看,似乎你对于指针的概念没太理解。指针变量中存储的是内存中的地址,而实际的数据放在这个地址中。
按照这段代码来说,int* 声明的指针指向内存中的一块地址,而在这块地址中存储着一个整形数值。所以要返回这样的值,也就相当于是返回一个内存地址。因此,在程序中有两种具体的解决办法:
1.在调用函数的时候,直接将变量的指针(即内存地址)作为参数传入,在函数执行的时候,就会自动对内存中相应地址的数据进行操作。使用这种方法也就不需要返回值了。具体到这段代码中,就是在Main中声明int* tempA[10],把foo函数声明为void foo(int* a[10]),调用时用foo(tempA),在foo函数中直接使用a[10]即可。
2.直接把内存地址作为返回值,因为在C中,数组名就是数组首元素的指针,因此直接返回数组名就可以了,即return a即可。如果是普通变量,要用取内存地址的运算符&,比如声明了整型变量 int i,就可以return &i。这与printf函数中的使用方法是相通的。
【按照补充的内容:】
a-------->a1-------->i1
|-------->a2-------->i2
|……………………
|-------->an-------->im
这样的调用方法,只能保证a1-an不被修改,怎么保证i1-im不被修改?
希望以上回答能帮到你。【PS.很久没用C了,如果哪里出了差错,请指正。】
追问
非常感谢你的回答,但可能是因为我的问题foo函数定义那漏写啦一个*,所以你理解错了,我遇到的问题是关于返回“指针数组”该怎么处理,返回“一般数组”对我来说应该没什么问题,更具体的问题,写在一楼(最先回答的那个人)的追问中了,但还是非常感谢你。
追答
如果是这样的结构
a-------->a1-------->i1
|-------->a2-------->i2
|……………………
|-------->an-------->im
这样的调用方法,只能保证a1-an不被修改,怎么保证i1-im不被修改?
对于你追问第一个人的内容,大概是因为,函数执行结束之后,只释放地址,而不清除地址中的数据吧。所以a1-an都被释放了。如果是普通数组,地址中的数据还在,用同样的指针就可以取到。
展开全部
首先,int *food()这个函数的返回值应该是指针类型,第一个问号为整形的指针,例如可以返回*a,第二个问号处,food()所返回的值是指针,所以等号左边也应该是指针,即*tempA=food()
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
下面这种形式就可以了。
int* foo()
{
int a[10];
... ... ...
return a;
}
int main(int argc, char* [])
{
... ... ...
int* tempA = foo();
... ... ...
}
不样子的写法有很多问题:
第一个就是内存管理一般是谁申请,谁释放,这个例子里面最好在main函数里面new出来;
第二个问题是,在子函数里面申请了内存,这个地方不知道这个指针的长度,很容易出现越界一类的问题,也是要注意的。应该有额外的标识符来指示结束位。
int* foo()
{
int a[10];
... ... ...
return a;
}
int main(int argc, char* [])
{
... ... ...
int* tempA = foo();
... ... ...
}
不样子的写法有很多问题:
第一个就是内存管理一般是谁申请,谁释放,这个例子里面最好在main函数里面new出来;
第二个问题是,在子函数里面申请了内存,这个地方不知道这个指针的长度,很容易出现越界一类的问题,也是要注意的。应该有额外的标识符来指示结束位。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先,你不应该返回局部变量的指针,因为局部变量在离开函数后就会被销毁。如果你想这样返回一个数组的话,你应该malloc出一个数组来返回。
至于应该return什么,return (malloc出来的那个指针)就可以了。
例如
int** foo()
{
int **p = (int **)malloc(sizeof(int *)*10);
... ... ...
return p;
}
这个p指向一个内存段,这个内存段存有十个int*类型的元素。
至于应该return什么,return (malloc出来的那个指针)就可以了。
例如
int** foo()
{
int **p = (int **)malloc(sizeof(int *)*10);
... ... ...
return p;
}
这个p指向一个内存段,这个内存段存有十个int*类型的元素。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐于2017-09-29
展开全部
首先,你不应该返回局部变量的指针,因为局部变量在离开函数后就会被销毁。如果你想这样返回一个数组的话,你应该malloc出一个数组来返回。
至于应该return什么,return (malloc出来的那个指针)就可以了。
例如
int** foo()
{
int **p = (int **)malloc(sizeof(int *)*10);
... ... ...
return p;
}
这个p指向一个内存段,这个内存段存有十个int*类型的元素。
至于应该return什么,return (malloc出来的那个指针)就可以了。
例如
int** foo()
{
int **p = (int **)malloc(sizeof(int *)*10);
... ... ...
return p;
}
这个p指向一个内存段,这个内存段存有十个int*类型的元素。
追问
非常感谢,但还有个地方不太明白哈:我那么写,不行的原因应该是:在foo函数结束后foo函数的那部分空间中创建的东东就都会被销毁啦,所以main中找不到foo中创建的东东,但我试了一下,如果让函数不返回“指针数组”而是返回“一般数组”,例如“存储int类型数据的数组”,这样的话,程序运行的就没有问题,但刚才的原理来说的话,这样的话应该不行啊,但为什么不会出现之前的问题呢?
追答
如果你只是读数组的数据可能不报错,但是你尝试更改这个数组的内容就应该会出错了,因为这时你试图去改写一块使用权不属于你的内存。
就算这个不出错,那也只说明你所用的编译器比较“仁慈”。
总之,这是不可取的做法
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询