VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 448|回复: 7

[求助] 指针问题

[复制链接]
16_avatar_middle
donate_vip 发表于 2019-2-1 23:24:50 | 显示全部楼层 |阅读模式
3驿站币
请问各位 红色箭头那儿为什么是:*q = &i; ?      

而不是**q=i,我自己测试**q=i,运行直接报错,**q=i不是取i对应的数值吗?  这里的*q=&i是什么意思?


我自己思考理解,把代码正向精简拆分了一下:再结合完整的代码看,才有点看懂   (代码不知道对不对,是不是这个意思)

        int i=5
        int *p=&i;  //p指向I的地址
        int* *q=&p;
        *q = &p;  // *q指向p的地址
        *q= &i;  // 因为上面*q就是p的地址,p的地址又指向i的地址,所以*q也指向i的地址


        按照图片中的代码拆分:
        int **q = &p;
        int i=5;
        *q = &i;

       图片的代码拆分看直接把我看懵了,刚接触指针,这个图片的代码拆分突然跟我上面正向的代码,少了好几个步骤,就不能理解了,没转过弯来,看我上面正向的代码我就能理解一点。。。。。。




所以想请各位帮忙解答一下,通俗一点,如果有简单代码举例最好,自己理解的还不是很深刻,刚接触指针,学的还不是很透彻,还是要一步一步拆分代码来看,希望各位帮忙解答透彻一点,以后再遇到这类有什么技巧,谢谢



QQ图片20190201225057.png

最佳答案

查看完整内容

其实这块楼主可以换一种思维来思考,不用什么地址,直接用类型来理解一下,要想赋值没问题,前提是 = 号左右两侧的类型一致对吧? q 是什么类型?int**,两个*,i是什么类型?int,对吧? *q 就是 int*,一个*,i的地址呢?就是&i,可以用 int* 来指向,对吧? 所以,*q 的类型是int*,&i 的也可以用 int* 来指向,所以:*q = &i 一点毛病没有啊




上一篇:请问多级指针的一个问题
下一篇:宏定义与函数名冲突的问题
16_avatar_middle
在线会员 发表于 2019-2-1 23:24:51 | 显示全部楼层
其实这块楼主可以换一种思维来思考,不用什么地址,直接用类型来理解一下,要想赋值没问题,前提是 = 号左右两侧的类型一致对吧?

q 是什么类型?int**,两个*,i是什么类型?int,对吧?
*q 就是 int*,一个*,i的地址呢?就是&i,可以用 int* 来指向,对吧?
所以,*q 的类型是int*,&i 的也可以用 int* 来指向,所以:*q = &i 一点毛病没有啊
16_avatar_middle
ico_lz  楼主| 发表于 2019-2-2 09:48:58 | 显示全部楼层
firefox 发表于 2019-2-1 23:42
其实这块楼主可以换一种思维来思考,不用什么地址,直接用类型来理解一下,要想赋值没问题,前提是 = 号左 ...

为什么这里的&i 会是Int *? &i不是int型吗?麻烦解答一下
75_avatar_middle
在线会员 发表于 2019-2-2 10:41:55 | 显示全部楼层
struct SBufInfo{
        SBufInfo()
        {
                p = NULL;
                nBufLen = 0;
        }
        WORD *p;
        int nBufLen;
};
class CMyNewDelete
{
public:
        CMyNewDelete()
        {
                m_arr.RemoveAll();
        }
                ~CMyNewDelete()
        {
                int nCount = m_arr.GetCount();
                for (int i = 0;i<nCount;i++)
                {
                        ASSERT(NULL != m_arr.GetAt(i).p);
                        delete[]m_arr.GetAt(i).p;
                }
        }
        BOOL MyNew(WORD**p,const int nLen)
        {
                ASSERT(NULL == *p);
                *p = new WORD[nLen];
                ASSERT(NULL != *p);
                if (NULL == *p)
                {
                        TRACE("数据内存申请失败\n");
                        return FALSE;
                }
                memset(*p,0,sizeof(WORD)*nLen);
                SBufInfo tem;
                tem.p = *p;
                tem.nBufLen = nLen;
                m_arr.Add(tem);
                return TRUE;
        }
        void Clean(WORD*p)
        {
                int nCount = m_arr.GetCount();
                for (int i = 0;i<nCount;i++)
                {
                        if (p == m_arr.GetAt(i).p)
                        {
                                memset(p,0,sizeof(WORD)*m_arr.GetAt(i).nBufLen);
                                return ;
                        }
                }
        }
private:
        CArray<SBufInfo,SBufInfo&>m_arr;
};



使用的时候 就是
WORD *wbuf33 = NULL;
CMyNewDelete myAutoBuf;
myAutoBuf.MyNew(&wbuf33,nLen);

以前自己瞎写的。我也就这里遇到过需要双重指针的情况:需要在某个函数中申请内存。

楼主你完全可以单步调试,看看 每个变量运行后指向的内容 和内存位置  就知道了

评分

参与人数 1驿站币 +2 热心值 +2 收起 理由
16_avatar_small 唯C + 2 + 2 很给力!

查看全部评分

16_avatar_middle
ico_lz  楼主| 发表于 2019-2-2 11:13:05 | 显示全部楼层
coldBro 发表于 2019-2-2 10:41
struct SBufInfo{
        SBufInfo()
        {

谢谢回答,兄弟你的代码我看不懂,我还没到你这个境界啊指针问题但是你说的单步调试这个方法挺好的!
16_avatar_middle
在线会员 发表于 2019-2-2 11:29:46 | 显示全部楼层
唯C 发表于 2019-2-2 09:48
为什么这里的&i 会是Int *? &i不是int型吗?麻烦解答一下

楼主要是这样问的话就有点太基础了。
i 变量的地址用什么表示?&i,对吧?
i 变量本身是 int 类型,难道 i 的地址还是 int 类型吗?
肯定是 int* p = &i 了,这个没错吧?

评分

参与人数 1驿站币 +2 热心值 +2 收起 理由
16_avatar_small 唯C + 2 + 2 很给力!

查看全部评分

16_avatar_middle
ico_lz  楼主| 发表于 2019-2-2 11:38:21 | 显示全部楼层
本帖最后由 唯C 于 2019-2-2 11:39 编辑
firefox 发表于 2019-2-2 11:29
楼主要是这样问的话就有点太基础了。
i 变量的地址用什么表示?&i,对吧?
i 变量本身是 int 类型,难 ...


谢谢,看懂了,刚接触c语言,才学到指针。。。。。
90_avatar_middle
在线会员 发表于 2019-2-9 21:52:46 | 显示全部楼层
嗯,路过学习下
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-8-19 12:48

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表