链表的由来和指针的思考

原创
2016/09/03 16:45
阅读数 43

今天看 C 语言的指针,原来在 C 中,动态增长的数组是很麻烦的。而链表的实现则相对简单。 在动态申请内存时,一次申请一大块空间经常会不成功,于是一次申请一点,用链表的形式 将现有的关联资源链接起来,这样就出现了一种常用的数据类型,链表。

在动态语言中,数据的动态增长是交给语言本身的,所以很少接触到这个东西。

除了定长的数据类型之外,在编译型语言中,动态增长的数据结构,使用指针(引用)作为 其内容,编译器比较容易优化。

int *p = []int (1,2,3)  => p = &[]int (1,2,3)

*p 在声明的时候,用在赋值表达式的左边,有匹配的效果。用在右边有解引用的效果。

[]int x = *p

而取地址操作符,只能用在右边,是一个函数,可以获取变量的值的地址。

指针计算被大多数系统语言抛弃,本身也可以用其他写法代替。指针最无可替代的用处就是 传递引用,有些语言会显式的解引用,例如 C C++ Go, 而有些语言会自动解引用,例如 PHP.

传递引用是语言必须有的特性,而解引用则可以自动进行,毕竟指针不能计算,而指针的指针也不能 计算,但可以比较,如果把一个指针的指针自动的解引用,那么就无法正确的比较。比较稳妥的办法 还是显式的解引用。

展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部