C++中关于链表中函数返回值为void**和链表中size_t m_nNextOffset偏移量问题

来源:百度知道 编辑:UC知道 时间:2024/06/30 15:57:30
#ifndef __AFXTLS_H__ // _AFXTLS_.H 文件
#define __AFXTLS_H__

#include <windows.h>
#include <stddef.h>

class CNoTrackObject;

////////////////////////////////////////////////
// CSimpleList

class CSimpleList
{
public:
CSimpleList(int nNextOffset = 0);
void Construct(int nNextOffset);

// 提供给用户的接口函数(Operations),用于添加、删除和遍历节点
BOOL IsEmpty() const;
void AddHead(void* p);
void RemoveAll();
void* GetHead() const;
void* GetNext(void* p) const;
BOOL Remove(void* p);

// 为实现接口函数所需的成员(Implementation)
void* m_pHead; // 链表中第一个元素的地址
size_t m_nNextOffset; // 数据结构中pNext成员的偏移量 /* 1. size_t是什么类型? m_nNextOffset 代表偏移量我不懂*/
void** GetNextPtr(void* p) const;/*2. 请问指向指针的指针到底代表的是什么?*/
};

// 类的内联函数
inline CSimpleList::CSimpleList(int nNextOffset)
{ m_pHead = NULL; m_nNextOffset = nNextOffset; }
inlin

首先问一下你是不是学的王艳平老师的哪个windows编程

回答你问题1:

size_t 是个无符号整数类型,m_nNextOffset代表的为对象首地址到对象成员地

址之间的偏移量,在书上是这样的一个宏 #define XXXX(a,b) (size_t)(((a *)

(0))->b),这个把对象的首地址初设置为0,求的是b的地址,其实也是b到a的一个

偏移量.

回答你的第二个问题.

void** 就是一个万能的指针的指针,可以存放任何一个类型的指针变量,跟你举

个例子

void ** Rll(int size)

{
void *p;

p=malloc(size);

return &p;
}

运用的时候: *(*(int**)(Rll(4))=54;这个函数可以申请指定大小,任意类型的

对象空间,并只需要传个大小过去就行了.2维指针在VC++的com技术里面用的十分

广泛的.

回答你第3个问题:改为 return *m_pHead;那么你返回值也要改为m_pHead的哪种

类型,那么这个类就只能存这种类型了,其他就无能为力了.因为C++里有万能指针

类型,而没有万能类型,如果想改为你说的那样,可以用摸板,王艳平老师其实

也写了你这个类的子类,再也把它摸版化了.就在你这个类的后面几页.

回答第四个问题:<不用回答了>

回答第五个问题:那不就是指针类型的了吗? int *p;**q; q=&p;

回答你第六个问题:<也不用回答了>

回答你第七个问题:可以这么说,用BYTE*的原因是因为是因为BYTE为一个字节,

这样就可以一个一个地址的+了最后