c语言为什么使用函数指针变量的值,对 “C语言指针变量做为函数参数” 的我的理解...

本文深入探讨了C语言中的指针概念,包括如何获取变量地址、声明指针变量以及指针在函数参数中的应用。通过实例展示了指针如何作为函数参数来修改实参的值,强调了指针在传递地址和修改内存内容中的关键作用。

C指针

C中每一个变量都有一个内存空间,每个内存空间都有本身的地址,咱们能够对变量使用 & 来获取变量地址,以下所示:web

//运行代码

#include

int main() {

int num = 1;

float fnum = 2.1f;

char letter = 'a';

printf("num 的地址为 %p\n", &num);

printf("fnum 的地址为 %p\n", &fnum);

printf("letter 的地址为 %p\n", &letter);

return 0;

}

//运行结果

num 的地址为 000000CE34B6FB54

fnum 的地址为 000000CE34B6FB74

letter 的地址为 000000CE34B6FB94

何为指针

指针是一个变量,它的值为另外一个变量的地址,即,内存空间的直接地址。咱们在使用指针存储其余变量地址以前,先进行声明。svg

DataType *ptr;

//DataType为变量类型,ptr为指针名称

int *iptr;/*整型指针*/

float *fptr;/*float型指针*/

char *cptr;/*字符型指针*/

全部数据类型对应指针的值的类型都是同样的,都是一个表明内存地址的十六进制数。

不一样数据类型的指针之间惟一的不一样是,指针所指向的变量或常量的数据类型不一样。函数

指针的使用

建立一个指针iptr存储num的地址。其中对指针使用星号*获取指针指向的值。布局

#include

int main() {

int num = 1;

int* iptr = #

printf("变量 num 的值为 %d\n", num);

printf("指针 iptr 所指向的值为 %d\n", *iptr);

printf("变量 num 的地址为 %p\n", &num);

printf("指针 iptr 所存储的地址为 %p\n", iptr);

return 0;

}

变量 num 的值为 1

指针 iptr 所指向的值为 1

变量 num 的地址为 000000A1E514F594

指针 iptr 所存储的地址为 000000A1E514F594

函数参数

当调用函数时,把实参的值复制给形参,而后函数用形参来进行相关操做。在函数内形参的值变化并不会影响实参的值变化。指针

#include

void test(int num) {

printf("test中 num的值为%d 地址为%p\n", num, &num);

}

int main() {

int num = 1;

printf("main中 num的值为%d 地址为%p\n", num, &num);

test(num);

return 0;

}

main中 num的值为1 地址为000000D6EA4FFC24

test中 num的值为1 地址为000000D6EA4FFC00

能够看出当函数调用时,形参只是复制了实参的值,它们的内存地址是不同的。

因此当形参改变本身的值时,相应的实参是不会变化的。code

#include

void test(int num) {

printf("test中 num的值为%d 地址为%p\n", num, &num);

num = 2;

printf("test中 num的值为%d 地址为%p\n", num, &num);

}

int main() {

int num = 1;

printf("main中 num的值为%d 地址为%p\n", num, &num);

test(num);

printf("main中 num的值为%d 地址为%p\n", num, &num);

return 0;

}

main中 num的值为1 地址为000000062894FA04

test中 num的值为1 地址为000000062894F9E0

test中 num的值为2 地址为000000062894F9E0

main中 num的值为1 地址为000000062894FA04

test函数内改变num的值时,是对形参num操做,所以实参num的值仍为1。xml

指针做为函数参数

为什么函数须要指针做为参数呢?

从上面能够看出,当咱们想用test函数对main中的num值进行修改时,其实main中的num是没有变化的。若是咱们想要经过函数操做改变main中num值时,该怎么操做呢?这就须要指针来进行相关的操做,从而实现咱们的需求(ps:固然咱们也能够经过return返回咱们须要的值)。ip

为何经过指针能修改实参值

咱们经过下面的一个例子来讲明内存

#include

void test(int *num_ptr) {

printf("test中 num_ptr存储的地址为%p 所指向的值为%d\n", num_ptr, *num_ptr);

*num_ptr = 2;

printf("test中 num_ptr存储的地址为%p 所指向的值为%d\n", num_ptr, *num_ptr);

}

int main() {

int num = 1;

printf("main中 num的地址为%p 值为%d\n", &num, num);

test(&num);

printf("main中 num的地址为%p 值为%d\n", &num, num);

return 0;

}

main中 num的地址为000000943AB2F6B4 值为1

test中 num_ptr存储的地址为000000943AB2F6B4 所指向的值为1

test中 num_ptr存储的地址为000000943AB2F6B4 所指向的值为2

main中 num的地址为000000943AB2F6B4 值为2

此时test的实参为num的地址,形参num_ptr复制的是num的地址。虽然在函数中对形参的值进行改变时,实参不会受到影响。但有趣的是,num_ptr的值是地址,当咱们经过修改此指针指向的内容时,num_ptr仍是存储的是num的地址,num的地址没有收到影响但num值已经改变。it

举个例子,把实参当一把钥匙,形参当作另外配的钥匙。

在函数内你从新改造形参钥匙(即更改内容),实参钥匙没有影响。

若是这时候有一个房间,实参是房间的钥匙(指针为钥匙,指向的内存为房间),因为形参钥匙与实参钥匙同样,故经过形参钥匙能够修改房间的布局(修改指向的内存内容)。当函数执行完后,形参钥匙被丢弃,房间布局已改变。

若是拿到形参钥匙,对钥匙进行改造,形参钥匙就只能开另一个房间。而原房间不受影响。

一句话

形参只是复制实参的值,形参如何变化无论实参的事。但形参经过指针修改指向的内容,就会影响实参所指向的内容,虽然此时形参和实参的值同样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值