| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 761 人关注过本帖, 1 人收藏
标题:有关结构体的问题
只看楼主 加入收藏
星112
Rank: 5Rank: 5
来 自:山西朔州
等 级:职业侠客
威 望:2
帖 子:94
专家分:342
注 册:2012-6-22
结帖率:100%
收藏(1)
 问题点数:0 回复次数:7 
有关结构体的问题
struct stu{int a;int b;};
struct stu1{char a;char b;};
main(){
    struct stu1 a1;
    struct stu a;
    a.a=1;
    a.b=2;
    a1.a='a';
    a1.b='c';
    printf("a:%d  %d  \na1:%c   %c ",a,a1);
}
为什么a的内容可以正确输出,a1的却不可以?结构体类型的变量名到底代表了什么?结构体变量到底能不能进行进行整体操作?
搜索更多相关主题的帖子: 结构体 
2012-06-22 10:20
雪狼MJ
Rank: 8Rank: 8
来 自:甘肃
等 级:蝙蝠侠
威 望:4
帖 子:267
专家分:853
注 册:2012-5-27
收藏
得分:0 
你的printf("a:%d  %d  \na1:%c   %c ",a,a1);是非法的,不被承认的!要访问结构的成员时,先写结构的名字,然后写一个句点,再写成员的名字!

Edsger Dijkstra:算法+数据结构=程序
2012-06-22 11:58
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
楼主这个问题问得相当好,大家都应该好好思考一下。

授人以渔,不授人以鱼。
2012-06-22 13:00
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
如果你不知道结构体解决了什么问题,如何对结构体数据printf(),参照一下下面程序的做法(注意其中的ToString()函数),想一想吧。

这是一个对平面坐标系坐标排序的程序:
程序代码:
* 坐标数据,可从数据表或外部数据文件中获取
DIMENSION aList[3,2]
aList[1,1] = 1.0
aList[1,2] = 5.0
aList[2,1] = 3.0
aList[2,2] = 3.0
aList[3,1] = 2.0
aList[3,2] = 4.0

* 建立坐标数组
CLEAR
? "排序前"
?
nNumber = ALEN(aList,1)
DIMENSION aCoords[nNumber]
FOR nIndex = 1 TO nNumber
    aCoords[nIndex] = CREATEOBJECT("Coord", aList[nIndex,1], aList[nIndex,2])
    ? aCoords[nIndex].ToString()
NEXT
?

Sort_Coord(@aCoords)        && 加@符号表示以传递地址方式传递参数

* 输出结果
? "排序后"
?
FOR nIndex = 1 TO nNumber
    ? aCoords[nIndex].ToString()
NEXT
?

RETURN 

*------------------------
* 自定义坐标类
*------------------------
DEFINE CLASS Coord AS Custom 

    HIDDEN x, y        && 内部数据,不允许外部直接修改x,y的值
    x = 0              && 横坐标
    y = 0              && 纵坐标
   
    *------------------------
    * 直接初始化,若不输入参数,则默认为(0,0)
    *------------------------
    PROCEDURE Init(tnX, tnY)
        IF PCOUNT() == 0
            This.x = 0
            This.y = 0
        ELSE
            IF (VARTYPE(tnX) == "N") .AND. (VARTYPE(tnY) == "N")
                This.x = tnX
                This.y = tnY
            ELSE
                This.x = 0
                This.y = 0
            ENDIF
        ENDIF
    ENDPROC
   
    FUNCTION GetX
        RETURN This.x
    ENDFUNC
   
    FUNCTION GetY
        RETURN This.y
    ENDFUNC
   
    *------------------------
    * 将另一坐标赋值给本坐标
    * 参数:toCoord -- 源坐标
    *------------------------
    FUNCTION SetFromCoord(toCoord AS Coord)
        This.x = toCoord.GetX()
        This.y = toCoord.GetY()
    ENDPROC 

    *------------------------
    * 比较本坐标与另一坐标的关系
    * 参数:toCoord -- 比较的坐标
    *       tnFlag  -- 比较横坐标抑或纵坐标,0是横坐标(默认),1是纵坐标
    * 返回:小于等于比较坐标,则返回真,否则返回假
    *------------------------
    FUNCTION Compare(toCoord AS Coord, tnFlag AS Integer) AS Boolean
        IF (PCOUNT() < 2) .OR. (VARTYPE(tnFlag) != "N")
            tnFlag = 0
        ENDIF
        IF tnFlag != 0
            tnFlag = 1
        ENDIF
        RETURN IIF(tnFlag == 0, This.x <= toCoord.GetX(), This.y <= toCoord.GetY())
    ENDFUNC 

    *------------------------
    * 将坐标转换为字符串形式
    *------------------------
    FUNCTION ToString() AS Character
        RETURN "(" + TRANSFORM(This.x) + "," + TRANSFORM(This.y) + ")"
    ENDFUNC
   
ENDDEFINE 

*------------------------
* 用冒泡排序算法对坐标数组进行排序
* 参数:taCoords -- 需排序的坐标数组,在原数组中返回排序结果
*       tnFlag   -- 坐标比较标志,0是横坐标(默认),1是纵坐标
*------------------------
PROCEDURE Sort_Coord(taCoords AS Coord, tnFlag AS Integer)
    LOCAL i, j, n, loCoord
   
    loCoord = CREATEOBJECT("Coord")
    n = ALEN(taCoords,1)
    FOR i = 1 TO n - 1
        FOR j = 2 TO n
            IF !taCoords[i].Compare(taCoords[j], tnFlag)    && taCoords[i] > taCoords[j]
                loCoord.SetFromCoord(taCoords[i])
                taCoords[i].SetFromCoord(taCoords[j])
                taCoords[j].SetFromCoord(loCoord)
            ENDIF
        NEXT
    NEXT
    
ENDPROC

如果你觉得这里对(x,y)坐标排序没什么用,不用如此兴师动众做类,那么设想一下,把(x,y)改为{学号,姓名,班级,……}这样的结构体即可。只要掌握了这种思想,不管什么语言、什么结构体,解决路子都是一样的。不同的只是具体的例子,但精神是完全一致的。

结构可以做类,只要有泛型算法,排序、链表、队列之类,都只要写一次,不必面向不同的数据写无数次大同小异的代码。如果不把众多的数据封装成一个有意义的数据,那么结构体其实是真没什么用途的。

[ 本帖最后由 TonyDeng 于 2012-6-22 15:00 编辑 ]

授人以渔,不授人以鱼。
2012-06-22 14:27
星112
Rank: 5Rank: 5
来 自:山西朔州
等 级:职业侠客
威 望:2
帖 子:94
专家分:342
注 册:2012-6-22
收藏
得分:0 
但是如果将Stu1中的类型也换成int型的话,输出当然也换成int,则可以正确输出,这到底是为什么呢?
2012-06-22 20:36
ndruan
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-6-22
收藏
得分:0 
结构体变量名指向那块结构体的首地址,你的printf里面定义的是%d型,输出结果就是从首地址开始的整形大小的数据,你的第二个结构体的首地址开始的数据是字符型,所以输不出来
2012-06-22 22:23
星112
Rank: 5Rank: 5
来 自:山西朔州
等 级:职业侠客
威 望:2
帖 子:94
专家分:342
注 册:2012-6-22
收藏
得分:0 
这个问题应该是这样的,大家看一下:
现在将问题转移到输出单个字节与输出两个字节出现了问题,研究一下它的处理机制。查看代码发现进行的是入栈操作,而进出栈是以两个字节为单位的,所以输出一个字节会报出错误。这其实是编译器进行了一次强制转化,将int型转化为char型,舍弃高位,只留低位。输出两个char型就进行了两次转换,所以两次输出来的一样,如果将代码变为a1.a=’c’;
A1.b=’a’;则会打印c.验证 。可以将结构体变量名看做一个数据类型,只不过它的类型的大小是不定了,是由我们自己定义的,所以输出的是它的内容,就相当于输出一个int型的变量,在输出的时候我们需要把握的是它的总字节数和输出是以字为单位的。
2012-06-23 00:30
shenzhijian
Rank: 2
等 级:论坛游民
帖 子:21
专家分:50
注 册:2012-6-23
收藏
得分:0 
首先,结构体变量名不代表地址,需要配合&运算符,其次结构体可以像一个变量一样赋值(两个结构体变量为同一类型)
2012-06-23 23:07
快速回复:有关结构体的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017577 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved