今天看 C 语言的指针,原来在 C 中,动态增长的数组是很麻烦的。而链表的实现则相对简单。 在动态申请内存时,一次申请一大块空间经常会不成功,于是一次申请一点,用链表的形式 将现有的关联资源链接起来,这样就出现了一种常用的数据类型,链表。
在动态语言中,数据的动态增长是交给语言本身的,所以很少接触到这个东西。
除了定长的数据类型之外,在编译型语言中,动态增长的数据结构,使用指针(引用)作为 其内容,编译器比较容易优化。
int *p = []int (1,2,3) => p = &[]int (1,2,3)
*p 在声明的时候,用在赋值表达式的左边,有匹配的效果。用在右边有解引用的效果。
[]int x = *p
而取地址操作符,只能用在右边,是一个函数,可以获取变量的值的地址。
指针计算被大多数系统语言抛弃,本身也可以用其他写法代替。指针最无可替代的用处就是 传递引用,有些语言会显式的解引用,例如 C C++ Go, 而有些语言会自动解引用,例如 PHP.
传递引用是语言必须有的特性,而解引用则可以自动进行,毕竟指针不能计算,而指针的指针也不能 计算,但可以比较,如果把一个指针的指针自动的解引用,那么就无法正确的比较。比较稳妥的办法 还是显式的解引用。