c语言引用结构体
㈠ c语言问题,就什麽叫结构体引用最好举点例子.
结构体引用,没有这个“专业用词”,但是从你的问题上来看,可以理解你的想法。
引用就是引用的意思,结构体是一种扩展的数据结构。
结构体一般可以根据实际需要设定内部的构造,比如存放商品信息的结构体
struct obj{
char name[20];//名字
int number;//编码
float price;//价钱
};
如上,就定义了一个结构体,但是这东西本身并无实际意义,它只是规定了一种格式。
商店的货品有许多样,比如100种商品。
struct obj commodity[100];这样,就定义了100个实际的空间。用来保存100种商品的信息
而比如我想获取或修改第八个商品的信息就用如下方法。
struct obj temp = commodity[7];//获取了第八个商品的结构体空间
temp.name="xx牌面包";//设定商品名称
temp.number=12345;//设定商品编码
temp.price=3.5f;//设定商品价钱
如上的定义结构体数组,从结构体数组中获取某一具体元素并对内容属性修改的一系列过程
就叫结构体引用拉。
㈡ c语言结构体里引用结构体
#include
struct person
{
char name[10];
int num;
};
void main()
{
struct person per[5];
void sort(struct person *, int );
int i;
printf("print letter:\n");
for(i=0;i<5;i++)
{
printf("name: ");
scanf("%s", &per[i].name);
printf("num: ");
scanf("%d", &per[i].num);
}
sort(per, 5);
for(i=0;i<5;i++)
printf("print: %s%d\n", per[i].name, per[i].num);
getch();
}
void sort(struct person *a, int n)
{
int i,j,t;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(a[i].num>a[j].num)
{
t=a[i].num; /*你代码中i写成j,这是细节问题*/
a[i].num=a[j].num;
a[j].num=t;
}
}
你代码有点问题,我给你改了改。TC测试通过。
除了注视的地方,还有几点要注意:
你源代码传送的是per[0].num的地址,记:a[0],但是a[1]的地址不等于
per[1].num的地址。
指针加1的意思你没理解好。
举个列子。
int a[10];
那么*(a+1)的意思是把a地址向后移动sizeof(int)个位。
所以你那个&a[1]指向的还是结构体中的数据。(恩,这里体现了低级语言的特性。每一个内存的每一位都要考虑到。要是你写个程序:200位的浮点数加法计算机,你更能体会到什么叫做考虑到每一位内存,调试的时候要一个内存一个内存的演算。代码我的空间里有,可以自己去看)
不懂的问
㈢ c语言结构体定义和使用是什么
c语言结构体是类似于名片形式的数据集合体,可以把它理解为一种由用户自定义的特殊的复合型的“数据类型”,在这个复合型的“数据类型”中可以包含多种基本数据类型,我们可以把它作为一个整体来操作。
c语言使用:结构体数组的引用与引用一个结构体变量在原理上是一样的。只不过结构体数组中有多个结构体变量,我们只需利用 for 循 环一个一个地使用结构体数组中的元素。
结构体的意义
结构体描述了一段内存的解释意义。
在内存中,数据的意义在于如何使用此段数据,如在内存中存有一个数据3,如果只把他当作正整数来使用,那么其意义为正整数3,如果把内存中的3,当作2的3次方来使用,那么3的意义则为指数3。而一个结构体则描述了一段内存中的数据的使用意义。
㈣ C语言源文件之间的自定义类型(结构体)如何相互引用
typedef struct tagMSG { // msg HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG; 引用这个结构体只要 MGS msg; 即可用了
㈤ c语言结构体调用
结构(struct)
结构是由基本数据类型构成的、并用一个标识符来命名的各种变量的组合。
结构中可以使用不同的数据类型。
1. 结构说明和结构变量定义
在Turbo C中, 结构也是一种数据类型, 可以使用结构变量, 因此, 象其它
类型的变量一样, 在使用结构变量时要先对其定义。
定义结构变量的一般格式为:
struct 结构名
{
类型 变量名;
类型 变量名;
...
} 结构变量;
结构名是结构的标识符不是变量名。
类型为第二节中所讲述的五种数据类型(整型、浮点型、字符型、指针型和
无值型)。
构成结构的每一个类型变量称为结构成员, 它象数组的元素一样, 但数组中
元素是以下标来访问的, 而结构是按变量名字来访问成员的。
下面举一个例子来说明怎样定义结构变量。
structstring
{
charname[8];
intage;
charsex[2];
chardepart[20];
floatwage1,wage2,wage3,wage4,wage5;
}person;
这个例子定义了一个结构名为string的结构变量person, 如果省略变量名
person, 则变成对结构的说明。用已说明的结构名也可定义结构变量。这样定义
时上例变成:
structstring
{
charname[8];
intage;
charsex[2];
chardepart[20];
floatwage1,wage2,wage3,wage4,wage5;
};
structstringperson;
结构说明, 再用结构名来定义变量。
例如:
struct string Tianyr, Liuqi, ...;
如果省略结构名, 则称之为无名结构, 这种情况常常出现在函数内部, 用这
种结构时前面的例子变成:
struct
{
charname[8];
intage;
charsex[2];
chardepart[20];
floatwage1,wage2,wage3,wage4,wage5;
}Tianyr,Liuqi;
结构是一个新的数据类型, 因此结构变量也可以象其它类型的变量一样赋值、
运算, 不同的是结构变量以成员作为基本变量。
结构成员的表示方式为:
结构变量.成员名
如果将"结构变量.成员名"看成一个整体, 则这个整体的数据类型与结构中
该成员的数据类型相同, 这样就可象前面所讲的变量那样使用。
下面这个例子定义了一个结构变量, 其中每个成员都从键盘接收数据, 然后
对结构中的浮点数求和, 并显示运算结果, 同时将数据以文本方式存入一个名为
wage.dat的磁盘文件中。请注意这个例子中不同结构成员的访问。
例3:
#include<stdio.h>
main()
{
struct{/*定义一个结构变量*/
charname[8];
intage;
charsex[2];
chardepart[20];
floatwage1,wage2,wage3,wage4,
wage5;
}a;
FILE*fp;
floatwage;
charc=’Y’;
fp="fopen"("wage.dat","w");
/*创建一个文件只写*/
while(c==’Y’||c==’y’)
/*判断是否继续循环*/
{
printf("/nName:");
scanf("%s",a.name);/*输入姓名*/
printf("Age:");
scanf("%d",&a.wage);/*输入年龄*/
printf("Sex:");
scanf("%d",a.sex);
printf("Dept:");
scanf("%s",a.depart);
printf("Wage1:");
scanf("%f",&a.wage1);/*输入工资*/
printf("Wage2:");
scanf("%f",&a.wage2);
printf("Wage3:");
scanf("%f",&a.wage3);
printf("Wage4:");
scanf("%f",&a.wage4);
printf("Wage5:");
scanf("%f",&a.wage5);
wage=a.wage1+a.wage2+a.wage3+a.wage4+a.wage5;
printf("Thesumofwageis
%6.2f/n",wage);/*显示结果*/
fprintf(fp,
"%10s%4d%4s%30s%10.2f/n",/*结果写入文件*/
a.name,a.age,a.sex,
a.depart,wage);
while(1)
{
printf("Continue?<Y/N>");
c="getche"();
if(c==’Y’||c==’y’||c==’N’||c==’n’)
break;
}
}
fclose(fp);
}
结构是一种新的数据类型, 同样可以有结构数组和结构指针。
一、结构数组
结构数组就是具有相同结构类型的变量集合。假如要定义一个班级40个同学
的姓名、性别、年龄和住址, 可以定义成一个结构数组。如下所示:
struct{
charname[8];
charsex[2];
intage;
charaddr[40];
}student[40];
也可定义为:
structstring{
charname[8];
charsex[2];
intage;
charaddr[40];
};
structstringstudent[40];
结构数组元素.成员名
例如:
student[0].name
student[30].age
实际上结构数组相当于一个二维构造, 第一维是结构数组元素, 每个元素是
一个结构变量, 第二维是结构成员。
注意:
结构数组的成员也可以是数组变量。
例如:
structa
{
intm[3][5];
floatf;
chars[20];
}y[4];
y[2].m[1][4]
二、结构指针
结构指针是指向结构的指针。它由一个加在结构变量名前的"*" 操作符来定
义, 例如用前面已说明的结构定义一个结构指针如下:
structstring{
charname[8];
charsex[2];
intage;
charaddr[40];
}*student;
也可省略结构指针名只作结构说明, 然后再用下面的语句定义结构指针。
struct string *student;
使用结构指针对结构成员的访问, 与结构变量对结构成员的访问在表达方式
上有所不同。结构指针对结构成员的访问表示为:
结构指针名->结构成员
其中"->"是两个符号"-"和">"的组合, 好象一个箭头指向结构成员。例如要
给上面定义的结构中name和age赋值, 可以用下面语句:
strcpy(student->name, "Lu G.C");
student->age=18;
实际上, student->name就是(*student).name的缩写形式。
需要指出的是结构指针是指向结构的一个指针, 即结构中第一个成员的首地
址, 因此在使用之前应该对结构指针初始化, 即分配整个结构长度的字节空间,
这可用下面函数完成, 仍以上例来说明如下:
student=(struct string*)malloc(size of
(struct string));
size of (struct string)自动求取string结构的字节长度,
malloc() 函数
定义了一个大小为结构长度的内存区域, 然后将其诈地址作为结构指针返回。
注意:
1. 结构作为一种数据类型, 因此定义的结构变量或结构指针变量同样有局
部变量和全程变量, 视定义的位置而定。
2. 结构变量名不是指向该结构的地址, 这与数组名的含义不同, 因此若需
要求结构中第一个成员的首地址应该是&[结构变量名]。
4. 结构的复杂形式
一、嵌套结构
嵌套结构是指在一个结构成员中可以包括其它一个结构, Turbo C 允许这种
嵌套。
例如: 下面是一个有嵌套的结构
structstring{
charname[8];
intage;
structaddraddress;
}student;
其中:addr为另一个结构的结构名,必须要先进行,说明,即
structaddr{
charcity[20];
unsignedlonzipcode;
chartel[14];
}
student.address.zipcode=200001;
每个结构成员名从最外层直到最内层逐个被列出, 即嵌套式结构成员的表达
方式是:
结构变量名.嵌套结构变量名.结构成员名
其中: 嵌套结构可以有很多, 结构成员名为最内层结构中不是结构的成员名。
二、位结构
位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构
比按位运算符更加方便。
位结构定义的一般形式为:
struct位结构名{
数据类型 变量名: 整型常数;
数据类型 变量名: 整型常数;
} 位结构变量;
其中: 数据类型必须是int(unsigned或signed)。 整型常数必须是非负的整
数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。
变量名是选择项, 可以不命名, 这样规定是为了排列需要。
例如: 下面定义了一个位结构。
struct{
unsigned incon: 8;
/*incon占用低字节的0~7共8位*/
unsigned txcolor:
4;/*txcolor占用高字节的0~3位共4位*/
unsigned bgcolor:
3;/*bgcolor占用高字节的4~6位共3位*/
unsigned blink: 1; /*blink占用高字节的第7位*/
}ch;
位结构成员的访问与结构成员的访问相同。
例如: 访问上例位结构中的bgcolor成员可写成:
ch.bgcolor
注意:
1. 位结构中的成员可以定义为unsigned, 也可定义为signed, 但当成员长
度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。
2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针,
如果是指针, 其成员访问方式同结构指针。
3. 位结构总长度(位数), 是各个位成员定义的位数之和, 可以超过两个字
节。
4. 位结构成员可以与其它结构成员一起使用。
例如:
structinfo{
charname[8];
intage;
structaddraddress;
floatpay;
unsignedstate:1;
unsignedpay:1;
}workers;’
上例的结构定义了关于一个工从的信息。其中有两个位结构成员, 每个位结
构成员只有一位, 因此只占一个字节但保存了两个信息, 该字节中第一位表示工
人的状态, 第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。
㈥ c语言里面的结构体是什么意思
结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,叫做结构。
在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。
结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。
(6)c语言引用结构体扩展阅读
将一个结构体变量中的数据传递给另一个函数,有下列3种方法:
(1) 用结构体变量名作参数。一般较少用这种方法。
(2) 用指向结构体变量的指针作实参,将结构体变量的地址传给形参。
(3) 用结构体变量的引用变量作函数参数。
在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除。C语言中是利用库函数malloc和free来分配和撤销内存空间的。
㈦ c语言中定义结构体有哪些方法
1.结构体类型数据的定义方法和引用方法
定义结构体:struct 结构体名
{
成员列表
};
定义结构体类型的变量:有三种形式
① 定义类型时定义变量:struct 结构体类型名
{
成员列表
}变量名列表;
② 直接定义结构类型变量:struct
{
成员列表
}变量名列表;
③ 由已定义的结构体类型来定义变量:struct 结构体类型名变量名列表;
引用结构体类型变量:在定义了结构体类型变量后,采用下列方法引用结构体类型的
变量:
结构体变量名.成员名
这里"."是成员(分量)运算符,它在所有的运算符中优先级最高。
使用结构体时注意:
(1)结构体类型和结构体类型变量是不同的概念,定义结构体类型变量时应先定义
结构体类型,然后再定义变量属于该类型。
(2)定义了—个结构体类型后,系统并没有为所定义的各成员项分配相应的存储空
间。只有定义了一个结构体类型变量,系统才为所定义的变量分配相应的存储空间。结构
体类型变量占用内存的字节数是所有成员占用内存长度之和。
(3)结构体成员的引用。如果一个结构体中又嵌套一个结构体,则要访问一个成员
时,应采取外层向内层逐级访问的方法。
㈧ C语言结构体成员的引用问题
scanf的用法,格式后的参数都必须是地址,name是数组名,本身就是数据,age和sex都是整型数据,必须使用取地址符&。
p是struct student*类型,stu是stu[3]这个数组的第一个元素的地址,p指向第一个元素,因此ABC都是对的,D错在把(int*)变量值赋值给(struct student*)变量,有个强制转换则不会错,因为age是结构体第一个变量,其地址就是结构体变量的地址。
是指针间的赋值,必须保证左右操作数的指针类型是一致的。由于n是结构体sk的第一个变量,因此其地址与结构体变量地址相同,可以强制转换得到正确的地址。
c是一个二维数组,p是一个指向数组的指针,因此p的*运算都是得到一个数组,**运算才能取到数组中的值。只有D是**运算。
(8)c语言引用结构体扩展阅读:
C语言初学者比较喜欢的Turbo C2.0提供了400多个运行时函数,每个函数都完成特定的功能,用户可随意调用。这些函数总体分成输入输出函数、数学函数、字符串和内存函数、与BIOS和DOS有关的函数、 字符屏幕和图形功能函数、过程控制函数、目录函数等。
Windows系统所提供的Windows SDK中包含了数千个跟Windows应用程序开发相关的函数。其他操作系统,如Linux,也同样提供了大量的函数让应用程序开发人员调用。
参考资料来源:网络-C语言
㈨ C语言结构体数据引用
都没错,就是普通的指针移动操作而已,但是注意你这样做的意义是什么
r = r->next;//r已经移动到了链表(结构体)的下一个节点
r->next = r->next->next;//之前r(最原始的r)的下一节点(即上面赋值改变的操作)的下一个节点移动到了再下一个节点
----------------------------------------------------------
说点自己的看法,首先,觉得楼主的结构体定义得有点问题,既然是typedef和struct混用的定义,那么就是先定义了一个结构体,但是你的这个结构体是没有标签的,然后你给这个结构体定义了一个别名mylist,好这个看上去是没问题,但是你的结构体里面的
struct mylist *next;是什么意思呢?mylist是什么?你的定义还没有完成怎么能在里面用后面的类型,还有,你定义的结构体标签是没有标签么?,但是我很奇怪为什么这里没有报错,而是在后面赋值的时候出现了不兼容的指针类型的警告。上面说得有点模糊,这样,你给struct加上一个标签定义成这样
typedef struct s_tag
{
char name[10];
char address[50];
char phonenum[20];
char email[20];
char remark[50];
struct s_tag *next;
}mylist;
保证你说的警告错误都没了
关于上面的更详细说明看这个http://..com/question/119210358.html的解答答案