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
举个例子,把实参当一把钥匙,形参当作另外配的钥匙。
在函数内你从新改造形参钥匙(即更改内容),实参钥匙没有影响。
若是这时候有一个房间,实参是房间的钥匙(指针为钥匙,指向的内存为房间),因为形参钥匙与实参钥匙同样,故经过形参钥匙能够修改房间的布局(修改指向的内存内容)。当函数执行完后,形参钥匙被丢弃,房间布局已改变。
若是拿到形参钥匙,对钥匙进行改造,形参钥匙就只能开另一个房间。而原房间不受影响。
一句话
形参只是复制实参的值,形参如何变化无论实参的事。但形参经过指针修改指向的内容,就会影响实参所指向的内容,虽然此时形参和实参的值同样。
本文深入探讨了C语言中的指针概念,包括如何获取变量地址、声明指针变量以及指针在函数参数中的应用。通过实例展示了指针如何作为函数参数来修改实参的值,强调了指针在传递地址和修改内存内容中的关键作用。
488

被折叠的 条评论
为什么被折叠?



