C 语言中的指针是啥玩意?
指针:就是存储器中某条数据的 地址
1.C 指针存在的意义
很多人包括我也难掌握指针的方方面面,既然它那么复杂,那么为什么会存在这个东东呢?我从本书中和知乎上总结了下:
- 函数调用时只传地址(一个指针),而不用传整份数据
- 避免副本和共享数据,不用每次都创建副本
在 为什么说指针是 C 语言的精髓? 问题上,我比较赞同 pansz 的答案:
C 语言只有值的传递,无法直接传递引用,要想传递引用必须通过指针间接实现。
如果 C 语言没有指针,一切都通过值传递,参数将永远只有输入参数,所有的结构体只要参与运算都具有极高的开销,因为每传递进函数参数一次就必须全体复制一次。
另外一点:C 语言无法在参数中传递数组,一切数组在函数参数传递时退化为指针,因此如果没有指针,数组将无法通过函数参数传递。
还有一点,在 C 语言中函数是一个指针,如果没有指针,就无法定义 C 语言函数,无法使用和调用 C 语言函数,更无法将函数作为一个变量传递。——换句话说,没有指针,C 语言将没有函数,一个没有函数的语言会是什么概念?
实际上指针这概念在绝大多数高级语言中都普遍运用了,只是人家不叫指针,通常叫做引用而已。例如 Java 的所有对象变量从 C 语言的角度都实际上保存的是一个指针而不是对象本身。
完全的舍弃指针,C 程序将变得低效难懂,因为你无法让在任何子函数中修改一个结构体的内容。这种程序类似于无状态程序。
2.如何理解指针
先看一个例子
int y = 1; //全局变量 y 位于全局量段,存储器地址 10000,值为 1 int main() { int x = 4; //局部变量 x 位于栈中,存储器地址 40000,值为 4 printf("address:%p", &x);// address:0x7fff5fbff838 return 0; }
在存储器中表示如下丑图:
我们发现指针就是指向变量的内存地址。
3.指针使用三部曲
3.1 &
运算符得到变量的地址
一旦得到变量的地址就要保存起来,需要指针变量,指针变量是一个用来保存存储器地址的变量。当 声明指针变量时,需要说明指针所指向的地址中保存的数据的类型:
int x=4; printf("x lives at %p\n", &x); int *address_of_x = &x;
这是一个 xx 变量,它 xx 的保存的是一个 x 地址,这个地址中 xx 保存的是一个 int x变量。
3.2 *
运算符读取地址中的内容
int value_stored = *address_of_x;
3.3 改变地址中的内容
如果你有一个指针变量,并想修改这个变量所指向地址中的数据,可以再次使用 *
运算符,只不过这次需要把指针变量放在赋值运算符的左边 xx:
*address_of_x = 99;
4. &
与 *
&
取地址符*
读取地址中的内容*
设置地址中的内容
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论