初学C语言对C指针的疑惑

关于C指针,在网上猛看一通,越看越混乱,到头来还是一头雾水。在此偷一下懒,向前辈请教一下。
我是由汇编转过来的,对于操作内存使用的偏移地址啥的概念还算比较清晰。就这C程序中的指针搞不懂。
我先说说我目前理解的指针。(写的有些长,请多担待)
1.指针是一个指向另外对象(内存地址)的变量
·但这个指针实质的变量数值是绝对地址还算偏移量?
如100H首地址下有一个数组,指针指向第三个(当char型),
那指针里的内容是103H还是03H?就是说是绝对地址还是偏移地址?
怎么样的语法取出这个数值?
指针是不是不允许直接写入常数?
又怎样的语法可以取出这个指针所指向数组的内容(就是数组的第三位)
2.指针是一个特殊变量,但还是一个变量而已,它自己也要占一个或多个绝对的地址
这取决指针的类型,那怎么样的语法能取到这个指针它所占的地址值?
3.指针指向的类型和指针本身类型可以不同或者说完全没关系
指向的类型说明了数据类型,也代表指针自加1时自身数值加的权数,
如int型指针可以指向int型地址也可以指向long int 型 ,区别是前者指针+1,自身数值+2,后再指针+1,自身数值+4.目的是为了匹配类型而已.
以上,是我暂时对C指针的朦胧见解和疑惑,
有错误的地方请各位高高手指出,万分感激。
(文字表达能力极差,也不知道大家能不能看懂,呵呵)

说说我的理解大家讨论:
1、C的变量都有四个基本属性:名称、类型、地址、内容,类型决定变量在内存占据的空间的大小和内容的存储形式。指针是一种以内存地址作为内容的变量,若定义了一个指针变量,它和其他变量一样具有自己的名称,存储地址和记录的内容,指针数据类型的变量与其他数据类型的变量在存储上的区别就是不论是什么数据类型的指针所占据的存储空间的大小是相同的。这一点是完全可以理解的,因为不论什么数据类型的数据、变量所占据内存空间的地址形式都是一样的,指针变量用来记录他们的地址,在存储空间的大小上自然就是没有区别的。
但是这并不意味着指针变量的数据类型就没有意义,它的作用在于决定这个指针在内存移动时,所移动的单位空间的大小。例如:在TC系统中每个整型变量占2个字节,实型变量占4个字节,字符型变量占一个字节;那么如果定义一个 int *ip,a[10]; ip=a; 也就是说使ip记录了数组a的首地址,那么在做 ip=ip+1;后变量ip中记录的就是 a[1] 的地址,你再继续进行 (a+1)运算,计算的结果就是 a【2】的地址。
如果定义了float *fp,b[10]; fp=ba; 使fp记录了数组b的首地址(也就是b【0】的地址),那么在做 fp=fp+1;后变量fp中记录的就是 b[1] 的地址,你再继续进行 (b+1)运算,计算的结果就是 b【2】的地址。也就是说指针移动的一个单位的字节数,是由指针的数据类型所决定的。
你对汇编熟悉,这一点是容易理解的吧。
在对指针变量被正确的赋值后,可以通过取值运算 * 取到由这个指针所指定的地址当中的内容(即由这个指针内容所决定的地址中的内容)。这个时候,完全可以想象指针的数据类型将起到决定性的作用,整型指针将按整数存储形式取回2个字节的内容,实型指针就按实数在内存的存储形式取回4个字节的内容。例如:float b【10】,*fp,y;经过必要运算之后,有运算 fp=b;y=*(fp+3);计算的结果是 y 记录了b【2】的内容。
2、想要取回一个指针的地址,就需要一个相同数据类型指针类型的指针变量,例如 int *p,a=5,**pp;
p=&a; //p可以记录相同数据类型变量的地址
pp=&p; //pp用于记录相同数据类型指针的地址
&是C的取地址运算符。
3、我想在你对汇编很熟悉的基础上,通过上述说明,不难体会定义指针的数据类型对于指针的作用了吧,也就是说某一种数据类型的指针在一般应用情况下,只用于记录具有相同数据类型变量和存储空间的地址。

这部分东西本身就是不容易理解,不知道说了半天是不是能帮上你一点。我想你有汇编的基础,应该比一般的初学者要好很多的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-11-05
好好耐心把书看一遍吧,书上写得很清楚了,你指针用法肯定没好好看

1 102开始,下标从0开始
剩下问题书上都有,不过问题3我没看懂
相似回答