首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

struct里的struct解决方法

2013-06-26 
struct里的structtypedef struct appinfo_list{char * filenameint app_indexchar * value[DKEY_COUNT]

struct里的struct
typedef struct appinfo_list
{
    char * filename;
    int app_index;
    char * value[DKEY_COUNT];
    int str_width;
    struct appinfo_list* prev;
    struct appinfo_list* next;
    struct appinfo_list* parent;
    struct appinfo_list* child;
} appinfo_list_t;
 

struct appinfo_list* prev;  prev是struct appinfo_list类型的指针变量是吧?prev结构体里有哪些参数呢? 还有指针吗? 说详细点好吗?
我的意思,你懂吧? struct
[解决办法]
1.pre,next,child,parent就是一个指针,指向分配结构体 appinfo_list的内存地址~ (分配结构体appinfo_info内存区域的起始地址)
然后你可以通过pre + offset(偏移)来实现对appinfo_list成员的访问了

2.prev结构体的参数就是appinfo_list所包含的成员了(起始应该这样说会比较恰当点: pre指向的数据结构所包含的参数就是appinfo_list所包含的所有成员了,因为pre就是一个指针一个int*类型的变量而已)

指针也是个普通的变量,只是指针里面存储的并不像其他变量(int,double)那样存储的是内存的实际数值,而是一个内存地址,该内存地址指向的内存区域存储的就是实际的变量值了~ 

[解决办法]
"prev是struct appinfo_list类型的指针变量是吧?"答,是的!
"prev结构体里有哪些参数呢?"答,错误,prev是一个指向结构体的指针,不是一个结构体.当他指向一个结构体的实例后,可以通过它调用该结构体内的所有元素.
[解决办法]

引用:
Quote: 引用:

"prev是struct appinfo_list类型的指针变量是吧?"答,是的!
"prev结构体里有哪些参数呢?"答,错误,prev是一个指向结构体的指针,不是一个结构体.当他指向一个结构体的实例后,可以通过它调用该结构体内的所有元素.
  reev既然可以通过指针调用结构体里的元素,是不是又调用到自己了?

指向一个结构体的实例后,可以通过它调用该结构体内的所有元素. 调用的是你给他的实例。prev->prev  依旧要给他实例,  看看链表的实现
[解决办法]
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”
但我又不得不承认:
 有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物;
 而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。
而我本人属前者。

这辈子不看内存地址和内存值;只画链表、指针示意图,画堆栈示意图,画各种示意图,甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗?本人深表怀疑!
这辈子不种麦不收麦不将麦粒拿去磨面;只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头,压面条,烤面包,……能从本质上理解面粉、理解面食吗?本人深表怀疑!!

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?

不要写连自己也预测不了结果的代码!

电脑内存只是一个一维二进制字节数组及其对应的二进制地址;


人脑才将电脑内存中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

[解决办法]

引用:
Quote: 引用:

"prev是struct appinfo_list类型的指针变量是吧?"答,是的!
"prev结构体里有哪些参数呢?"答,错误,prev是一个指向结构体的指针,不是一个结构体.当他指向一个结构体的实例后,可以通过它调用该结构体内的所有元素.
  reev既然可以通过指针调用结构体里的元素,是不是又调用到自己了?

不是.它是一个指针,给他赋值后指向一个将来会调用到的结构体(即赋值的那个).此时相当于一个结构体变量的地址了.比如说如下如下例子:
appinfo_list_t test;
prev = &test;
此时prev->app_index VS test.app_index;其实是一个意思.那你会认为test调用了自己吗?
[解决办法]
struct foo {
    struct foo * bar;
};
foo里面的不是struct,而是个指针,刚好这个指针,能指向一个foo对象罢了。

[解决办法]
typedef struct appinfo_list
{
    char * filename;
    int app_index;
    char * value[DKEY_COUNT];
    int str_width;
    struct appinfo_list* prev;
    struct appinfo_list* next;
    struct appinfo_list* parent;
    struct appinfo_list* child;
} appinfo_list_t;
prev 只是一个指针而已,没有任何结构在里面。
而且只是一个结构的成员,或者叫域(field)而已;
必须定义了,一个实实在在的 定义一个appinfo_list_t 或者struct appinfo_list 类型
的变量。
或者定义一个appinfo_list_t 或者struct appinfo_list指针,并动态分配内存,
这个指针域才有意义。
这是链式存储的数据结构。
程序通过链,持有一个指针就可以,持有一串指针(无名对象);
appinfo_list_t aL ;
这时aL.prev 有了意义;但是每位这个指针赋值和分配内存前,这个aL.prev只是个野指针。只有为它分配了内存,或者让他指向一个实际的变量(用一个变量的地址给它赋值),这个指针才持有一个appinfo_list_t对象;这个没有名字或者看不到名字的对象拥有有这个结构。
就是说这时,*aL.prev 才是一个appinfo_list_t结构对象;

C++:appinfo_list_t *pAL=new appinfo_list_t;
*pAL 是一个appinfo_list_t结构对象,pAL->prev 是个指针,不是一个appinfo_list_t结构对象;
*pAL->prev 此时还是个野指针,没有指向实际的对象。
pAL->prev =new appinfo_list_t;此时*pAL->prev 才是一个实际的appinfo_list_t结构对象。
C :(c++也可以这么做)
appinfo_list_t *pAL=(appinfo_list_t *)malloc (sizeof(appinfo_list_t));
*pAL 是一个appinfo_list_t结构对象,pAL->prev 是个指针,不是一个appinfo_list_t结构对象;
*pAL->prev 此时还是个野指针,没有指向实际的对象。
pAL->prev =new =(appinfo_list_t *)malloc (sizeof(appinfo_list_t));
此时*pAL->prev 才是一个实际的appinfo_list_t结构对象。

PS:这里没有递归定义;
这是C,C++链表结点,树结点,等链式结构的定义方式。

typedef struct appinfo_list
{
    char * filename;
    int app_index;
    char * value[DKEY_COUNT];
    int str_width;
    struct appinfo_list* prev;/*正确, struct appinfo_list 已经说明了,可以定义指针*/
    struct appinfo_list* next;
    struct appinfo_list* parent;
    struct appinfo_list* child;
} appinfo_list_t;

struct cannotdef{

struct cannotdef no;/*错误,没有struct cannotdef的完整定义,不能定义对象(变量) */

};

定义指针和定义对象(声明指针和对象)的方式完全不同,定义指针(说明指针)只要有类型的声明,就可以了。
对象则需要知道类型完整的定义。
函数声明里,定义函数参数不需要完整的定义,只要函数定义处能够见到结构的完整定义就可以了。

另外C++;
类,结构的内部,类和结构的定义是完全可见的。
不过依然不可递归定义类或者结构,因为编译器,没法解析这个结构,不知道应该定义多大。



热点排行