指针是个麻烦的机制,刚才想到很多,趁没忘赶紧记下来
指针的性质有点类似光的波粒二相性。 它有两种属性,一个说明了变量的地址(绝对的),另一个说明了内存占用的大小,也可以理解为指针的合理变化范围(相对的)。后者不是一定要声明的。当后者没有声明的时候,指针只能指向一个变量,一个类型大小的变量。后者存在的时候,指针就变成了类数组的东西,但是,它比数组要强大。
拿数组和有范围的指针作个对比。数组是有长度的,它必须在编译时确定,指针的长度(在这里我无法用一个准确的词表示上文所说的第二个属性,暂切用住这样的说法)却可以用malloc函数后期确定。而malloc的参数一般用sizeof(类型)*n算出,这个n就类似数组元素的个数,于是实现动态内存管理。对元素逐个操作用指针表示为++p,这里我必须提到指针的第三个属性,个体的大小,也就是所指类型的一个变量的内存大小,这也是之前为什么会出现sizeof(类型)的原因。 ? 为什么说第二个属性是可有可无,而不是和第三个属性是一样的呢?或者说为什么这里要把第二第三个属性区分开来呢?因为如果你这样声明一个字符指针char* a;那么a表示什么呢?它不但可以表示一个字符,也可以表示一个字符串。如果它表示一个字符,则必须(请注意这个必须)令它指向一个字符变量才能使用。如果它是一个字符串,用a=(char*)malloc(sizeof(char)*n);给它长度它就可以表示字符个数为n-1的字符串,而且最重要的是它不用指向某个确定的数组!它自己就是数组了,这里我不想拿指针和数组比,我更想说这时它所表示的和数组表示的一样了!
再来看一个例子,如果声明了一个结构的指针,而且指针有个范围(第二属性存在,存在结构数组),那么++p的意思就是指向下一个结构,结构是自己定义的,感觉上象进化了的数组,这里指针利用了本身第三个属性。然而,在函数参数中,用指针传递一个结构时,这个指针必须指向一个结构!这里的指针又不同于数组了,虽然结构与数组都是数据集合。但是结构更象是真正的把数据打包。毕竟指针默认就是以结构进行跳转,而数组,必须把指针定义到上一级下标。
一口气写下这么多,希望也能对大家有点帮助 如果你有任何想法,请与我探讨
|