返回列表 回复 发帖

感觉指针学习超难

我在学习指针的时候感觉真的难,有几个概念搞不明白,书是看了几本,就是觉得说的很模糊。如:
int  *intp1,*intp2;  //定义两个整型指针
int   a;
*intp1=&a;   //取变量a的地址给*intp1。-------------*intp1在这里是指针还是指针变量?应该是指针吧?
intp1=&a;     //取变量a的地址给变量intp1。-------intp1在这里是指针还是指针变量?是指针变量吧?如果是指针变量,那么前面没有定义呀,只有指针定义呀int  *intp1,后面能用吗?是什么类型数据?
*intp2=*intp1;//将*intp2指向与*intp1相同。--------
在这里
intp1=&a; 和*intp1=&a;都保存的是内存的地址,难道两个都是指针不成?指针和指针变量是同一回事吗?但是很多书上说指针变量简称指针,可是我总觉得还不是一样。
望哪位高手指点下迷津,我真的糊涂了。
指针确实难于理解。指针具有两个身份:

第一,指针本身是一个变量。只要是是变量,它就占用内存地址。当然如果没有分配内存地址,不在其内。

第二,指针包含一定的一个内容。指针所特殊的就是,他的内容保存的是其他变量的地址。

以上两点可以通过书中的示例7-7有比较好的体现。

例如,定义指针变量intp1。  intp1=&a  就表示 intp1保存的信息为a的地址。
而*intp1表示是intp1所保存地址的内存单元所保存的值,实际就是a的值。

所以,你给出的  *intp1=&a;   是一种不太合适写法。我们可以这样假设,再给一个变量b。令*intp1=b=&a,则
b=&a,说明b保存的a的地址,这样b就是一个指针。那*intp1=b,则说明 intp1所保存的地址指向的内存单元为b。所以,intp1可以看成a的指针的指针。

上面这个例子比较绕,慢慢想想,就理解了。
补充一点:

intp=&a   和*intp=a  是等效的。都是给指针intp赋值。
*intp是一个已经定义的指针,但是intp是没有定义的变量呀,难道在定义*intp指针时就定义了该类型的intp变量?如果我们都没定义intp,那怎么给它赋值呢intp=&a,那不违法?
指针可以这样赋值:*intp=a    ?
不是要这样吗?*intp=&a;
另外,书中的示例7-2可能有错。
int * Pint ;          //定义一个整型指针
char * pchar;      //定义一个字符指针
float * Pfloat;      //定义一个float型数据指针
void * Pvoid;     //定义一个无类型指针
short * myId;    //定义了一个short指针(并没其它定义,看看书上应该是错了)
bool * Pbool1,Pbool2 ;        //定义了一个指针和一个整型变量
bool * Pbool1,Pbool2 ;        //定义了一个指针和一个整型变量  
这里是我搞错的,应该是
bool * Pbool1,Pbool2 ;        //定义了一个指针和一个bool变量
1

评分次数

  • fwbook

*intp是一个已经定义的指针,但是intp是没有定义的变量呀,难道在定义*intp指针时就定义了该类型的intp变量?如果我们都没定义intp,那怎么给它赋值呢intp=&a,那不违法?
指针可以这样赋值:*intp=a    ?
不是要 ...
Tomy 发表于 2009-10-30 16:40
呵呵。这是你理解错误。*并不是变量名的一部分,它只是用来表示该变量是一个指针。更准确的说,它是一个运算符。它的作用和&刚好相反。

所以,int *intp1就是对intp1进行定义。这里加*,只是为了表明它是一个指针。理解这一点,你后面的就不是问题了。
bool * Pbool1,Pbool2 ;        //定义了一个指针和一个整型变量  
这里是我搞错的,应该是
bool * Pbool1,Pbool2 ;        //定义了一个指针和一个bool变量
Tomy 发表于 2009-10-30 16:54
看到了。应该是印刷错误。我确认一下。确认后,再给你消息。谢谢你发现这个问题。
谢谢,非常感谢管理员给我提示,要不,这条路我真走不下去了。
“int *intp1就是对intp1进行定义。这里加*,只是为了表明它是一个指针。”------也就是说真正的变量时inp1。
“*并不是变量名的一部分,它只是用来表示该变量是一个指针。更准确的说,它是一个运算符。它的作用和&刚好相反。”-----------是哦,*不是标示符的字符,就更加不可能是变量名了,我把它当变量标示符的一部分了,真笨!!!!看样子我把对指针变量的操作和指针定义的符号*也搞混了,*intp1出现时它是一个操作,是个表达式吧。一语惊醒梦中人呀,呵呵,感谢感谢。。。
解决问题,就好。也感谢你发的资源。

指针学习小结(一)[/b]


1、指针的概念
   1.用来操作地址的特殊类型变量就是指针。
      2.是一类包含了其他变量或函数的地址的变量。
      3.指针就是用来存储内存地址的变量。
2、指针的定义
   语法格式:
       数据类型 *  变量标示符;
   说明:
       1.数据类型是指针指向的内存的数据类型。
       2.变量标示符为合法标示符。
       3.如果定义多个同一类型的变量,应用逗号将其分开;如果是定义多个同一类型的指针变量应该在变量前加“*”。
       4.指针在使用前必须初始化。
   例1如下:
       int a=10,b=20;                                           //定义两个整型变量
              char sch1,sch2;                          //定义两个字符变量
              int  * pint1,*pint2=&b;                 //定义两个整型指针变量 pint1,pint2;并初始化pint2
              char  * pch1,pch2=&sch2 ;       //定义两个字符指针变量pch1,pch2,并初始化pch2
              pint1=&a;                                     //初始化整型指针
              pch1=&sch1;                              //初始化字符指针
3、关于指针的两个操作
     操作符 *    作用:符号*称作间接访问运算符,对指针变量在内存中指向的数据操作。
           用法 :
                               *  指针变量
         
           操作符&   作用:符号&称作取地址运算符,对任何变量取地址操作。
      用法:
                  &变量名
        借例1中定义  :
                                           *pint1;                       //对pint1在内存中指向的数据进行操作(a=10),相当于将 pint1=a;
                                           pch1=&sch1;          //将sch1中地址取出来赋值给pch1;
4、简单指针数据处理程序
      1.程序如下:
//**********************************
//*******point001.cpp***************
//**********************************
# include <iostream.h>
void main(void)
{
        int a=10,b=20;
        int * p1,* p2;   //*在这里只起定义作用,并非标示符p1,p2的一部分,p1,p2为指针变量。
        p1=&a; //       
        p2=&b;//       
        cout<<"p1指向内存数据:"<< *p1<<'\t'  //*********输出间接访问p1指向内存的数据值。
                <<"p1指向内存的地址:"<<p1<<'\t'    //**********输出指针变量p1指向的地址值。
                <<"指针p1地址值:"<<&p1<<endl; //**********输出指针变量p1本身地址值
        cout<<"p2指向内存数据:"<< *p2<<'\t'
                <<"p2指向内存的地址:"<<p2<<'\t'
                <<"指针p2地址值:"<<&p2<<endl;       
}

      2.程序运行前后内存数据变化演示

       假设运行前内存状态               
内存地址        内存数据        变量名
…        …        …
1000        10        a
…        …        …
1800        20        b
…        …        …
…        …        …
2000        …        p1
…        …        …
2200        …        p2

        假设运行后内存状态               
内存地址        内存数据        变量名
…        …        …
1000        10        a
…        …        …
1800        20        b
…        …        …
…        …        …
2000        1000        p1
…        …        …
2200        1800        p2

        运行后内存状态               
内存地址        内存数据        变量名
…        …        …
0X0012FF74        10        a
…        …        …
0X0012FF70        20        b
…        …        …
…        …        …
0X0012FF7C        0X0012FF74        p1
…        …        …
0X0012FF78        0X0012FF70        p2
自己整理的?
是的哦,难学就只好这样子了,让你们见笑了,呵呵。
主要看到你的笔记中有一处不太好。
就是关于例1的第三行代码
int  *pint1,*pint2=&b;

中间的*pint2=&b不太好。这个很容易让你以后迷惑的。最好改为:
*pint2=b
返回列表