日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

指针作为函数形参

發(fā)布時(shí)間:2023/12/18 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 指针作为函数形参 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

普通函數(shù)參數(shù)

下面程序試圖改變main函數(shù)中ab的值

#include<stdio.h>

void fun(int x,int y)

{

???int c;

???c=a;

???a=b;

???b=c;

}

int main()

{

???int a=1,b=2;

???fun(a,b);

???printf("a=%d b=%d\n",a,b);

???return 0;

}

函數(shù)參數(shù)傳遞分析:

實(shí)參:

&a 28ff18

a? 1

&b 28ff14

b? 2

?

?

?

在將實(shí)參傳遞給形參的時(shí)候,編譯器將實(shí)參拷貝一份給形參。

拷貝份的特點(diǎn)為:

1) 值與實(shí)參相同

2) 地址與實(shí)參不同

拷貝份(形參)

&x 28ff04

x? 1

&y 28ff00

y? 2

?

?

?

則在函數(shù)內(nèi)部更改拷貝份的時(shí)候,只是對(duì)函數(shù)內(nèi)部的局部變量改變,而局部變量是存儲(chǔ)在棧空間里的,當(dāng)fun函數(shù)執(zhí)行結(jié)束后,這兩個(gè)變量會(huì)自動(dòng)銷毀,不會(huì)改變實(shí)參的數(shù)值。

?

一級(jí)指針作為函數(shù)參數(shù)

下面程序試圖改變main函數(shù)中ab的值

#include<stdio.h>

void fun(int *a,int *b)

{

???int c;

???c=*a;

???*a=*b;

???*b=c;

}

int main()

{

???int *a,*b;

???int x=1,y=2;

???a=&x;

b=&y;

fun(a,b);

???printf("a=%d b=%d\n",x,y);

???return 0;

}

函數(shù)參數(shù)傳遞分析

?

main中變量的存儲(chǔ)情況如下

?

變量地址

變量值

&x: 28ff18

x:1

&y: 28ff14

y:2

指針變量地址

指針變量?jī)?nèi)容

指針表示地址里的內(nèi)容

&a:28ff28

a: &x

*a:? x

&b:28ff24

b: &y

*b:? y

?

?

?

?

?

可見在main函數(shù)中,指針ab的地址為28ff2828ff24。而指針ab存儲(chǔ)的內(nèi)容為xy的地址28ff1828ff14*a,*b則是代表xy變量的值。

當(dāng)調(diào)用fun函數(shù)時(shí)。main中的指針ab則要拷貝一份給fun函數(shù)的形參。則形參的存儲(chǔ)情況如下:

形參指針變量地址

形參指針變量?jī)?nèi)容

形參指針變量存儲(chǔ)的地址表示的內(nèi)容

&a28f740

a: 28ff18

*a:? x

&b28f736

b: 28ff14

*b:? y

?

?

?

?

?

?

?

可見:把實(shí)參指針變量傳遞給形參后。

實(shí)參指針和形參指針的地址是不相同的。但是存儲(chǔ)的內(nèi)容確實(shí)相同的。均是指向main函數(shù)中的xy變量,當(dāng)再fun函數(shù)中執(zhí)行c=*a;*a=*b;*b=c;交換語(yǔ)句時(shí)。*a*bmain函數(shù)中的xy變量。這時(shí)候?qū)?huì)交換這兩個(gè)變量的值。

?

二級(jí)指針作為函數(shù)參數(shù)

如果想在函數(shù)中改變父函數(shù)中的指針變量呢。

#include<stdio.h>

void fun(int **c)

{

???int *b;

b=(int *)malloc(sizeof(int));

*b=2;

?*c=b;

}

int main()

{

???int *a,x=1;

???a=&x;

???printf("%x\n",a);

???fun(&a);

???printf("%x\n",a);

???return 0;

}

函數(shù)的實(shí)參存儲(chǔ)如下:

指針變量地址

指針變量值

指針變量值表示的內(nèi)容

&a:28f73b

a:28f740

*a: x 1

?

變量地址

變量值

&x:28f740

x: 1

?

?

?

?

?

函數(shù)的形參存儲(chǔ)如下

&c

c:(&a)

*c:(a)

**c:(*a=x)

28ff1c

28f73b

28f740

1

?

?

?

?

局部變量b的存儲(chǔ)如下

&b

b(堆空間地址)

*b

28ffeec

391798

2

?

?

?

函數(shù)運(yùn)行完后,指針變量a的指向則為在fun函數(shù)中申請(qǐng)的堆空間的地址,存儲(chǔ)如下

?

指針變量地址

指針變量值

指針變量值表示的內(nèi)容

&a:28f73b

a:381798

*a: 2

?

?

?

?

?

?

?

將一級(jí)指針的地址賦值給形參的話,將會(huì)將一級(jí)指針的地址,變量值都賦值給二級(jí)指針的形參。此時(shí)在函數(shù)內(nèi)部,二級(jí)指針(c)則能后獲得外部一級(jí)指針變量(a)的地址、變量值、和普通變量(i)的值。只要知道實(shí)參變量的地址,則在函數(shù)內(nèi)部就可以改變實(shí)參變量的值。所以這里的二級(jí)指針就可以改變一級(jí)指針?biāo)赶虻膬?nèi)容(一級(jí)指針變量的值),一級(jí)指針?biāo)赶虻刂返膬?nèi)容。函數(shù)運(yùn)行完后,一級(jí)指針a則指向申請(qǐng)的堆空間的地址,指向地址的內(nèi)容則為堆空間存儲(chǔ)的內(nèi)容,不再指向變量i

?

指針數(shù)組作為函數(shù)參數(shù)

下面程序是利用指針數(shù)組改變數(shù)組的值

#include<stdio.h>

void fun(int *c[],int n)

{

???int i;

???for(i=0;i<n;i++){

???????*c[i]=0;

??? }

}

?

int main()

{

???int b[3]={1,2,3};

???int *a[3]={b,b+1,b+2};

???fun(a,3);

???return 0;

}

main函數(shù)中變量的存儲(chǔ)情況如下

地址

內(nèi)容

&b[0]:28ff04

b[0]:1

&b[1]:28ff08

b[1]:2

&b[2]:28ff0c

b[2]:3

地址

內(nèi)容

指向內(nèi)容

?

?

a:28fef8

a[0]:28ff04

*a[0]

?

?

a+1:28fefc

a[1]:28ff08

?

?

?

a+2:28ff00

a[2]:28ff0c

?

?

?

?點(diǎn)擊打開鏈接

?

?

總結(jié)

以上是生活随笔為你收集整理的指针作为函数形参的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。