C 语言中的指针是啥玩意?

发布于 2024-03-15 10:33:42 字数 2424 浏览 21 评论 0

指针:就是存储器中某条数据的 地址

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

坏尐絯℡

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

内心激荡

文章 0 评论 0

JSmiles

文章 0 评论 0

左秋

文章 0 评论 0

迪街小绵羊

文章 0 评论 0

瞳孔里扚悲伤

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文