当前位置:学习生活->会员解答 ->c指针的指向与赋值的区别

原创版权标志c指针的指向与赋值的区别

作者:longhua2003  发表时间:2017/10/25 22:11:25  阅读:
[摘要] C++技术网已经用心解答了用户提出的问题【c指针的指向与赋值的区别】,如还有问题,请继续在文章底部留言交流,直到完全懂了为止。

一直以来,经常会听到别人讲,这个指针指向另一个指针,我感觉有时会晕,因为它们之间太相似了,如以下的代码:

char* xx = "dddss";
char* yy = "sd5";
xx = yy;
指针xx存放的就是地址,以上的代码就是把xx的地址换成了yy的地址,这时,我叫把yy的地址赋值给了指针xx,是可以的,也可以叫xx指向了yy吗,如果这不能叫指向,那什么情况下才叫指向呢?这是问题1。

针对以上的问题,我有和别人交流过,别人说,二级指针,才有指向,就是指向指针的指针,我写了一段代码:

    int a = 10;
int b = 20;
int * px = &a;
int *py = &b;

cout << "px="<< *px<< endl;
cout << "py="<< *py<< endl;
cout << "xx="<< xx<< endl;

int** p2 = NULL;
p2 = &py;

cout << "b的地址="<<&b<< endl;
cout << "py本身的地址="<< &py<< endl;
cout << "py指向的地址="<< py<< endl;
cout << "p2指向的地址="<< p2<< endl;
cout << "p2指向一级指针的地址="<< *p2<< endl; //这里不知有没有理解错,望指正
cout << "p2指向一级指针的值(解引用)="<< **p2<< endl;

cout << "& p2本身的地址="<< &p2<< endl;
上面我写了关于二级指针的运用,于是我画了以下的图解,麻烦看一下,是否理解正确,这是问题2:

请指教一下,感谢了



C++技术网会员解答:

    感谢您对C++技术网的支持与信任。

    我就不一一的解释你的代码了。你画的图,是基本正确的。

    我再解释一下指针指向的理解。

    我们这里说的指针,其实是指针变量。一定不要忘记了!指针是什么?指针什么也不是。指针是我们理解指针变量这种形式的变量而取的一个形象的名字而已。单独说指针,是没有意义的。不管是说指针,还是说指向指针的指针,隐含的意思就是说指针变量和指向指针变量的指针变量。而变量就是一个内存块,是一个实体!正是有这样一个内存实体,才进行了内存块的实体编号,才有了内存。内存块的编号的序号就是内存地址。而存储了这个地址编号,而且也仅用作地址索引的变量,才叫做指针变量。指针变量这个内存块只能存储有效的内存地址。

    地址是一个索引内存块的一个指示,通过地址我们可以找到这个内存块。所以我们想象比喻成指针。那么存储这个地址的就是指针变量。而指针变量本身也是一个变量,同样也是有一个地址的,这样就可以有另外一个变量存储的值可以作为前面这个指针变量的地址。这就是所谓的指向指针变量的指针变量。

    指向这种说法,也隐含了一种理解,那就是,指向的必须是变量,也就是必须是一个内存块。如果就是一个编号,那就是一个数字而已,数字只是一个数,不需要索引,直接称呼就行了。而内存地址就是一个数字,不存在指向的问题。我们所谓的指向一个内存地址,其实也是说的指向一个内存地址所在的内存块。如果你直接将一个数字假装是内存地址,然后赋值给一个指针变量,那么这个指针变量的值是无效的。我们会将这个指针变量称为无效指针变量,它存储的地址值就是无效地址。

    图中标注的箭头基本意思是对的,然而箭头所指应该是方框的内存块,而不是地址值。指针变量存储的地址值就是为了找到内存块的,不是去找内存地址值的。本身就存储了内存地址,还用得着去找吗??

    如果时刻记得,平常所说的指针,是指针变量的简称,指向指针的指针是指向指针变量的指针变量,相信就清晰许多了。指向的含义其实就是指存储的值是内存地址值而已。

    我想,通过这样的解释,应该能够理解的更加清楚了吧。当然,上面说的一些名词,是我自己造的,不是官方的说法,不必在意,懂得意思就行了。

文章来源:C++技术网原创文章版权为网站和作者共同所有,会员文章禁止转载。非会员文章转载做好本文超链接即表示授权转载。通过文章下面的分享按钮可以自由分享所有文章。


  • longhua2003    2017/10/25 22:34:20回复
    谢谢,明白了

返回顶部

在线提问
问题标题:
问题描述:(简陋的描述会导致问题被最后回答、没有针对性回答甚至无法解答。请确保问题描述的足够清楚。)