你好

措美網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián),措美網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為措美近千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營銷網(wǎng)站建設(shè)要多少錢,請找那個(gè)售后服務(wù)好的措美做網(wǎng)站的公司定做!
從問題來看,似乎你對于指針的概念沒太理解。指針變量中存儲的是內(nèi)存中的地址,而實(shí)際的數(shù)據(jù)放在這個(gè)地址中。
按照這段代碼來說,int* 聲明的指針指向內(nèi)存中的一塊地址,而在這塊地址中存儲著一個(gè)整形數(shù)值。所以要返回這樣的值,也就相當(dāng)于是返回一個(gè)內(nèi)存地址。因此,在程序中有兩種具體的解決辦法:
1.在調(diào)用函數(shù)的時(shí)候,直接將變量的指針(即內(nèi)存地址)作為參數(shù)傳入,在函數(shù)執(zhí)行的時(shí)候,就會自動對內(nèi)存中相應(yīng)地址的數(shù)據(jù)進(jìn)行操作。使用這種方法也就不需要返回值了。具體到這段代碼中,就是在Main中聲明int* tempA[10],把foo函數(shù)聲明為void foo(int* a[10]),調(diào)用時(shí)用foo(tempA),在foo函數(shù)中直接使用a[10]即可。
2.直接把內(nèi)存地址作為返回值,因?yàn)樵贑中,數(shù)組名就是數(shù)組首元素的指針,因此直接返回?cái)?shù)組名就可以了,即return a即可。如果是普通變量,要用取內(nèi)存地址的運(yùn)算符,比如聲明了整型變量 int i,就可以return i。這與printf函數(shù)中的使用方法是相通的。
【按照補(bǔ)充的內(nèi)容:】
a--------a1--------i1
|--------a2--------i2
|……………………
|--------an--------im
這樣的調(diào)用方法,只能保證a1-an不被修改,怎么保證i1-im不被修改?
希望以上回答能幫到你。【PS.很久沒用C了,如果哪里出了差錯(cuò),請指正。】
首先,說一下第一個(gè)問題,第一個(gè)不交換是因?yàn)槎x的k是一個(gè)指針,指針說白了就是一個(gè)指向,我指向你,他指向她,然后換成我指向她,他指向你,你把他們指向的位置交換,而并沒有交換他們地址里面存儲的值,這樣是并沒有任何區(qū)別,在最后函數(shù)結(jié)束之后,函數(shù)的那些指針指向全部釋放,和修改不修改沒什么兩樣;定義的是一個(gè)整型變量,他把s
指針指向的地址里面的值與
t
指針指向的地址的值進(jìn)行了交換,這樣就修改了內(nèi)存里面的值,即便是函數(shù)結(jié)束了也不會釋放,自然就能做到交換了。
第二個(gè)問題,存儲地址是會釋放,但是釋放的是函數(shù)內(nèi)部定義的局部變量,現(xiàn)在你已經(jīng)把s的地址通過return
返回回來并且存在
主函數(shù)的
r
中了,所以自然就不會釋放了
這是個(gè)函數(shù)指針 前面的void為返回值類型 后面的void*為參數(shù)類型.
函數(shù)指針是可以作為某個(gè)函數(shù)的參數(shù)的.
(1) 指向函數(shù)的指針變量的一般定義形式為:
數(shù)據(jù)類型 (*指針變量名)(函數(shù)參數(shù)列表)
函數(shù)名是可以缺省的 作為參數(shù)傳遞的時(shí)候會去調(diào)和 void*(*)(void*)這個(gè)類型相匹配的函數(shù)的
作為參數(shù)調(diào)用這個(gè)函數(shù)的時(shí)候 返回類型是void* 就相當(dāng)于傳了一個(gè)參數(shù)類型為void*,當(dāng)然這個(gè)函數(shù)指針的參數(shù)也是void*的
這種方式叫做“用指針函數(shù)*creat()的返回值來傳遞動態(tài)內(nèi)存”,這是一個(gè)C語法
首先你要注意,子函數(shù)*creat()用了malloc動態(tài)申請內(nèi)存,而return返回的是指針變量所指向的地址,而不是指針!相當(dāng)于將你所申請的動態(tài)內(nèi)存返回給主函數(shù)
int
*fun(void)//這里是指針函數(shù)
{
int
*p
=
(int
*)
malloc
(int);//動態(tài)申請內(nèi)存//p在這里指向了一塊合法內(nèi)存的地址
return
p;
}
void
main(void)
{
int
*q
=
NULL;
q
=
fun();//fun()返回指針p所指向的地址,(指針p是在棧上創(chuàng)建的,所以*fun()函數(shù)運(yùn)行完,指針?biāo)峙涞膬?nèi)存被系統(tǒng)自動釋放)這時(shí)q指向p,得到了malloc所申請到的內(nèi)存
free(q);//釋放動態(tài)內(nèi)存
}
不知下列代碼對你是否有用
記住:C中只有_值_傳遞!
#include conio.h
#include stdio.h
void fun(int **pp, int *i);
int main(void)
{
int *p, i;
i = 88;
fun(p, i);
printf("%d\n", *p);
getch();
return 0;
}
void fun(int **pp, int *i)
{
*pp = i;
}
或者
#include conio.h
#include stdio.h
#include stdlib.h
#define N 100
void getmemory(int **pp, int n);
int main(void)
{
int *p, i;
getmemory(p, N);
for (i = 0; i N; i++)
p[i] = i;
for (i = 0; i N; i++)
(i+1)%10 ? printf("%3d", p[i]) : printf("%3d\n", p[i]); /*輸出0~99*/
getch();
return 0;
}
void getmemory(int **pp, int n)
{
*pp = (int *)malloc(n * sizeof(int));
}
本文名稱:c語言函數(shù)參數(shù)傳回指針 c語言 指針傳參
網(wǎng)站網(wǎng)址:http://chinadenli.net/article2/hepcic.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、網(wǎng)站維護(hù)、外貿(mào)建站、移動網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)