探索 C 语言的指针
2022/9/15 23:20:08
本文主要是介绍探索 C 语言的指针,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
指针的概念
指针也就是内存地址,指针变量是用来存放内存地址的变量。指针没有实际的值,在使用变量的时候不要错以为指针等于变量。指针是门牌号,房间是变量,房间里的东西是变量的值。
房间有户型,三室一厅、二室一厅等。不管房间是什么类型的,门牌号都是唯一的。只要有门牌号我就能无误地找到这个房间。
G、7776 都是存储在内存中的值,变量名对应着它们。而每一个变量都有唯一的内存地址(机器地址)。指针指向的就是内存地址,而不是实际的值。
通过间接运算符*
声明一个指针变量,指针变量的数据类型要与指向的变量的数据类型保持一致。假如,feet 变量是一个int
类型,指针的类型也是int
。指针通过&
得到变量的内存地址,把内存地址取出来给 pfeet 指针变量:
int main(void) { int feet = 10; int* pfeet = &feet; printf("before updating feet is %d\n", feet); // before updating feet is 10 *pfeet += 10; printf("now feet is %d\n", feet); // now feet is 20 return 0; }
上面说到,指针不等于变量,第四行,pfeet 只是得到了内存地址,直接修改 pfeet 相当于把内存地址修改了,但实际上不影响 feet 在内存中的实际内存地址。第七行,在引用指针变量时要在前面加上间接运算符*
,意思是找到内存地址所对应的变量,修改变量的值。
指针在函数间通信
指针与变量的作用好像都是一样,指针也没有什么特别之处?实际上,变量的局限性很大,指针的自由度很高。得益于作用域,函数内声明的局部变量不可以被其他函数直接访问和修改。
void change(int, int); int main(void) { int x = 10, y = 5; change(x, y); printf("[3] x = %d, y = %d\n", x, y); return 0; } void change(int x, int y) { printf("[1] x = %d, y = %d\n", x, y); x = 20; y = 10; printf("[2] x = %d, y = %d\n", x, y); }
在 main 函数中声明了 x 和 y,再把这两个变量传递给 change 函数修改。修改 x 和 y 之后是否影响 main 函数中的 x 和 y?
很显然不行,实际上 main 函数中声明的 x 和 y 的内存地址与 change 函数中的 x 和 y 内存地址不是一致的。也就是说,两个函数中同样的变量名,实际上不是一个东西。
如果非要改变 main 函数的 x 和 y,可以使用指针,指针不受函数作用域的影响。指针指向的是内存地址,只要拿到内存地址,找到门牌号,就能修改、更新变量的值。
下面通过指针来修改 main 函数的 x 和 y:
void change(int*, int*); int main(void) { int x = 10, y = 5; change(&x, &y); printf("[3] x = %d, y = %d. x Address = %p, y Address = %p\n", x, y, &x, &y); return 0; } void change(int* x, int* y) { printf("[1] x = %d, y = %d. x Address = %p, y Address = %p\n", *x, *y, x, y); *x = 20; *y = 10; printf("[2] x = %d, y = %d. x Address = %p, y Address = %p\n", *x, *y, x, y); }
change 函数接收的不是一个变量了,而是一个指针。函数找到内存地址所对应的变量,修改变量的值。那么,main 函数的 x 和 y 也随着改变:
这篇关于探索 C 语言的指针的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-27文件掩码什么意思?-icode9专业技术文章分享
- 2024-12-27如何使用循环来处理多个订单的退款请求,代码怎么写?-icode9专业技术文章分享
- 2024-12-27VSCode 在编辑时切换到另一个文件后再切回来如何保持在原来的位置?-icode9专业技术文章分享
- 2024-12-27Sealos Devbox 基础教程:使用 Cursor 从零开发一个 One API 替代品 审核中
- 2024-12-27TypeScript面试真题解析与实战指南
- 2024-12-27TypeScript大厂面试真题详解与解析
- 2024-12-26怎么使用nsenter命令进入容器?-icode9专业技术文章分享
- 2024-12-26导入文件提示存在乱码,请确定使用的是UTF-8编码怎么解决?-icode9专业技术文章分享
- 2024-12-26csv文件怎么设置编码?-icode9专业技术文章分享
- 2024-12-25TypeScript基础知识详解