C语言结构体中的[]问题,非高手莫进!

作者&投稿:郅宰 (若有异议请与网页底部的电邮联系)
C语言 结构体名 与 结构体变量的区别~

结构体名是类型,就像int,结构体变量就相当于通常的变量一样.

"pl_type pl[32];什么意思"
"pl_type"是类型,类似于int, float, 区别在于这个"pl_type"是上面刚刚定义的;
“pl_type pl[32]”是声明一个pl_type类型的数组,数组名称是pl,数组的长度(大小)是32个。

"还有那句typedef struct pfc_struct已经定义了,怎么右花括号那儿还有个pfc_type“
这只是一种用法,可以看成三个部分:
第一部分:“typedef” 是类型定义的关键字。
第二部分:“struct pfc_struct{/*页面控制结构*/
int pn, pfn;
struct pfc_struct *next;
}” 是被定义的数据结构,这里“pfc_struct”可以没有,就像第一个定义(pl_type )一样。
第三部分: “pfc_type;” 是定义的名称。这样,后面就可以直接使用这个名称来定义变量了,例子可以参考上面"pl_type pl[32];什么意思"的答案;

“还有下面的指针”
这里的pfc前面应该有它的定义吧。
其实指向变量,或者结构体的指针都是类似的:指针变量中保存的数据是一个地址,计算机或者程序,通过这个地址就可以访问到那个变量或者结构体了。

编译对那个 char table[]; 这种定义会默认解释成 char table[0];
零长数组, 这个特性多数是编译器的扩展, 零长数组是不占用空间的,你它进行 sizeof() 返回是零, 它只是在语法上提供一个符号, 访问它相关于访问 tt.num 后续的内存, 就像你第二个例子, 由于局部变量是在栈上分配的, 所以 tt.table[0] 正好落在 begin 上第一个字节上(即低字节), 所以 tt.table[0] = 2 相当于:
((char *)&begin)[0] = 2;

没有给table分配空间,自然是地址不定了阿

在C语言中,只有定义了变量系统才给分配空间,
而char table[];这句话相当于char table[0];没有申请到内存空间,只给了个起始地址,应为根本就没有定义变量,只有char table[1];或者别的数字,才表示定义了char型变量table[0],只有定义了变量系统才给分配空间所以申请到的内存为0, 而且写成这样char table[1];表示从起始地址char table[]开始有了偏移量,并且因为是结构体,分配单位是4个字节,也就是说写成这样的char table[1];表示分配到4个字节大小的空间,直到char table[5];是才分配下一个单位的空间,即为8个字节的空间。

零长度数组:

它们作为结构体的最后一个元素十分有用,如果结构体确实是变长对象的首部:

struct line {
int length;
char contents[0];
};

struct line *thisline = (struct line *)
malloc (sizeof (struct line) + this_length);
thisline->length = this_length;

在ISO C89中,你需要给目录分配长度1,意味着要浪费空间或者使malloc的参数变得复杂。

在ISO C99中,你可以使用灵活的数组元素,只是在语法和主义上有微小的差异。

灵活的数组元素写为contents[]不带0。

灵活的数组元素具有不完全的类型,所以sizeof操作也许不能被应用。作为零长度数组的原始实现的奇怪之处,sizeof被赋值为0。

灵活的数组元素可以作为结构体的最后一个元素出现当其它元素非空时。定义仅含有一个零长度数组的结构体,无论如何,你可能会遇到问题。这样的用法被反对,建议仅当灵活数组元素被允许的地方使用零长度数组。


c语言中结构体后面的[数字]是什么意思
int t;} a[1000];这样语法是没问题的。结构体数组。

C语言中,哪些运算符具有左结合性?哪些具有右结合性?
其中圆方括号很明显“()、[]”,箭头 指的是指向结构体成员运算符“->”,句号 指的是结构体成员运算符“.” ; “自增自减非反负、针强地址长度”指的是第14级的运算符。其中 非 指的是逻辑运算符“!”,反 指的是按位取反运算符“~”,负 指的是负号运算符“-”,针 指的是指针运...

C语言结构体中的 . 和 -> 是什么意思
.是普通的结构体类型的变量取用结构体里的元素,->是定义了一个该结构体类型的指针变量取用结构体的元素。

c语言中 struct student {………}stu[N]; stu[N]是什么意思?
struct为关键字结构体;student 为类型名,{}内为结构体的组成成分,如学生的班级、学号、成绩等;stu是一个结构体变量,即一个学生的班级、学号、成绩等信息。现在有N个学生,就需要定义一个结构体数组,stu[N],用来存放N个学生的班级、学号、成绩等信息。

C语言 结构体中的typedef struct {Adjlist ajdlist int n,e}是什么...
typedef struct Adjlist { int n,e;}ajdlist;我觉得你这么写更容易理解,这段话的意思是定义一个名为 Adjlist的 结构体 ,他的别名是 adjlist,也就是说你可能用 Adjlist或者 adjlist任意一个定义一个结构变量。Adjlist var1;adjlist var2;这俩是一个意思 ...

C语言中if(a[i].s
a 是一个数组,其元素是 结构类型的变量 举例:请点击输入图片描述

C语言当中结构句后面一个星号,是什么意思?
1、定义一个指向结构变量的指针。2、C语言中的结构体 格式:struct 结构体标识名 { 类型名1 结构成员表1;类型名2 结构成员表2;„„类型名n 结构成员表n;};注意:struct是关键字,是结构体类型的标志。“结构体标识名”和“结构体成员名”都是用户定义的标识符,“结构体...

c语言中结构体中有数组和指针时,什么情况下用->什么情况用.
typedef struct { int a ;}TYPE ;使用结构体变量的成员时候用.如TYPE v ;采用 v.a= xxx;使用的是结构体指针指向的结构体的成员的时候用-> 如 TYPE *p ;p = &v ;采用p->.a = yyy ;总之,->前面一定是个指针, “.”前面是个结构体或共用体变量 ...

C语言 结构体中的typedef struct {Adjlist ajdlist int n,e}是什么...
typedef struct Adjlist { int n,e;}ajdlist;我觉得你这么写更容易理解,这段话的意思是定义一个名为 Adjlist的结构体,他的别名是 adjlist,也就是说你可能用 Adjlist或者 adjlist任意一个定义一个结构变量。Adjlist var1;adjlist var2;这俩是一个意思 ...

C语言结构体中struct和typedef struct有什么区别?
C语言结构体中struct和typedef struct区别为:声明不同、访问不同、重新定义不同。一、声明不同 1、struct:struct可以直接使用结构体名字声明结构体。2、typedef struct:typedef struct的为。修饰结构体,结构体有了别名,通过结构体别名声明结构体。二、访问不同 1、struct:struct定义的结构体变量,可...

六枝特区17682942458: C语言关于结构体的小问题
骑姬牛黄: 应该对你有帮助的!在f函数中s是一个临时的变量,它随着f的调用而产生,随着f的结束而消失,你这里的交换只是在f中临时调换了p指向的地址,并没有改变p指向地址的内存中的内容,要想改变里面的内容就要解指针,给具体存放数据的内存赋值,例如p[1]=s[1];等等.

六枝特区17682942458: 关于C语言结构体的问题 拜托高手帮忙! -
骑姬牛黄: 当一个对象有很多属性的时候,就可以使用结构体对它进行定义.实质上,结构体也是相当于c++中的类一样,是一种特殊的类.就比如说一个学生,他有姓名,性别,年龄,学号,成绩等属性,那么这时候就可以采用结构体对一个学生进行定...

六枝特区17682942458: C语言里面结构体初始化遇到问题!!求助高手!! -
骑姬牛黄: 楼主,这是编译器的问题.你的编译器不支持对一个结构体型的自动(automatic)变量内部的域进行一次性初始化.在这样的编译环境下,任何类似 struct s1 b = { "hello", 1, &b }; 这样的初始化的语句都是非法的.TC确实不允许这样的初始...

六枝特区17682942458: c语言结构体输入的问题 -
骑姬牛黄: 第一个是正确的 后续, 由于%c读取了上一个输入的换行, 导致出错. 修改方法 在scanf的for循环中, scanf下面一行, 加一句getchar(); 注意加大括号.

六枝特区17682942458: c语言关于结构体一些疑问
骑姬牛黄: 因为结构类型定义 typedef struct elem { int c; double coef;} POLYNODE; 是在函数外定义的,所以该结构类型属于全局类型,所以在main()函数中出现的语句: POLYNODE stack[100],x; 就是定义结构elem的一个实体,此时可以看作一个基础数据类型,比如int char等,故stack[100]是结构elem的数组,而x是结构elem的变量.

六枝特区17682942458: 一个c语言结构体问题 -
骑姬牛黄: typedef struct LNode { ElemType data; struct LNode *next }LNode,*LinkList;这是结构体定义的一种方式,typedef是给结构体去别名的,所以第一行的struct LNode是结构体名字,在C语言中要用struct LNode定义编译器才能识别, 直接使用LNode会出错,不过用了typedef定义别名之后,就可以直接使用LNode定义结构体了,就是说第三行的LNode是struct LNode的别名,而*LinkList也是别名,不过是针对struct LNode的指针来定义的,相当于struct LNode* 希望没把你绕晕

六枝特区17682942458: C语言中用结构体类型构造结点,结点及数组名占用内存的问题 -
骑姬牛黄: 有一点你要搞清楚,就是32位的机子上,不管什么指针,都是4字节(4*8bit=32bit,即32位),所以sizeof(next)是4字节,因为next是指针.还有一个概念是“字节对齐”,详细的话可以到网上搜一下.基本准则是这样的: 字节对齐的细节和...

六枝特区17682942458: C语言的结构体问题 -
骑姬牛黄: void sort(struct student stu[],int n) { int i,j,k; struct student t; f...

六枝特区17682942458: C语言结构体访问的问题? -
骑姬牛黄: 是否使用“->”访问取决于指针a的含义 a可以有两个意思,一个是表示STREC类型的数组,另一个是表示STREC实例的地址.如果是表示数组(就是你这段程序要表达的),那么必须使用[i]获取第i个实例,然后再用“.”运算符取出成员 如果表示实例地址,则可以直接使用“->”取出成员 但无论是哪一种,都不能a->s[i],这样表示取出数组中第一个STRCE实例的s成员再取s的[i],但是很明显s是型的.不知你明白了吗?

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网