c访问c结构体
⑴ 关于C语言结构体访问的问题。
放在.h头文件中再#include是一个办法
另一个办法是使用extern关键字
首先要明白,编译器是分别编译源文件的,也就是分别编译test.c和main.c
test.c中使用到main.c中定义的变量的话,在main.c中加上
externsomeTypevar;//比如externinta;
加上这行代码编译器才知道你确实在别的地方定义了这么一个东西,在连接阶段linker会连接编译阶段分别生成的.obj文件,这时候就确实可以找到b这个变量了。
当然,对于你这个情况,用extern编译器虽然知道了有b这么一个变量,但是还是不知道有
struct{
inta;
}
这么一个结构体类型,那编译器当然不知道
b.a
表示的是什么意思。还是报错。所以还是用#include吧
⑵ C语言结构体指针成员所指向的变量如何访问
结构体指针羡雀成员所指向变量,这个说法理烂指解起来有点困难。
从字面意思上看断句,有如下几种可能:
首先定义一个包含所有可能情况的结构体:
struct test
{
int a;
int *p;
};
struct test t1, *t2;1
结构体/指针成员/所指向的变量。
结构体中有指针成员,然后要访问这个结构体成员指向的变量值。
那么可以*(t1.p)这兄历早种方式对p取值。
2
结构体指针/成员/所指向变量。
这种情况有两种方法可以访问:
*(t2->p)
或者
*(*(t2).p)
效果是一样的。
3
描述有误,实际为:
结构体指针所指向/成员变量。
同样有两种方法可以使用:
t2->p
或者
(*t2).p
⑶ C语言访问一个结构体
//在C语言里,&用于取地址,没用声明参数的用法,你这样用“SqQueue& Q”是不合法的
void InitQueue(SqQueue *Q)//SqQueue *Q是定义SqQueue类型的指针,与&Q的类型相同,
{
Q->base = (QElemType*)malloc(QUEUE_INIT_SIZE*sizeof(QElemType));
.......
}
main方法
int main()
{
QEIemType d;
SqQueue Q; //其它结构体没什么复杂的,除了要自己定义之外,与其它系统提供数据类型的用法是一样的
InitQueue(&Q);//Q是结构体,加&就是到Q的地址,这里你可以把Q当作一个普通参数,在InitQueue函数里把Q当作指针对待。InitQueue函数里的Q与main里的Q不是一样的。
......
}
⑷ C语言 对结构体类型的变量的成员的访问,无论成员是何种数据类型都可使用的运算符是()。
通常,访问一个结构体的变量的成员使用的运算符是点;比如一个结构体变量为sudent,它有一个成员为name,要访问结构体变量student中的成员name,直接可使用student.name来访问;
补充:当我们定义了一个指向结构体变量的指针时,可用运算符->去访问他的成员。
⑸ C语言结构体指针成员所指向的变量如何访问
第一种写法:
(*a).p=&b;
.的优先级高于*,(*pointer)两边的括号不能少。如果去掉括号写作*pointer.memberName,那么就等效于*(pointer.memberName),这样意义就完全不对了。
第二种写法:
a->p=&b;
->是一个新的运算符,习惯称它为“箭头”,有了它,可以通过结构体指针直接取得结构体成员;这也是->在C语言中的唯一用途。
结构体是一种数据类型,是一种创建变量的模板,编译器不会为它分配内存空间,就像 int、float、char 这些关键字本身不占用内存一样;结构体变量才包含实实在在的数据,才需要内存来存储。下面的写法是错误的,不可能去取一个结构体名的地址,也不能将它赋值给其他变量。
(5)c访问c结构体扩展阅读:
用指针引用结构体变量成员方式总结与技巧:
一、(*指针变量饥兄名).成员名
注意,*p 两边的括号不可省略,因为成员运算符“.”的优先级高于指针运算符“*”,所以如果 *p 两边的括号省略的话,那么 *p.num 就等价于 *(p.num) 了。
因为指针变量 p 指向的是结构体变量第一个成员的地址,即字符数组烂棚袭 name 的首地址,所以 p 和 (*p).name 是等价的。
“等价”仅仅是说它们表示的是同一个内存单元的地址,但它们的类型是不同的。指针变量 p 是 struct 型的,而 (*p).name 是 char* 型的。所以在 strcpy 中不能将 (*p).name 改成 p。用 %s 进行输入或输出时,输入参数或输出参数也只能写成 (*p).name 而不能写成 p。
二、直接用:指针变量名->成员名
来代替,它们是等价的。“->”是“指向结构体成员运算符”,它的优先级同结构体成员运算符“.”一样高和启。p->num 的含义是:指针变量 p 所指向的结构体变量中的 num 成员。p->num 最终代表的就是 num 这个成员中的内容。
⑹ C语言对结构体文件的读取
C语言中对结构体数据格式文件进行读取时,必须以二进制格式打开文件,然后按结构体类型变量内存块方式进行数据读取,相关读数据命令为fread()。
函数说明:
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
从stream文件流中,读取nmemb个size大小的数据块到ptr所指的内存buf中,返回读取到的有效数据块数。
如,有如下结构体定义:
typedef struct TEST
{
int num;
double score;
}STRTEST;
STRTEST data ;
FILE *fp = fopen("file.dat", "rb" ) ; //按二进制格式打开文件
int n=fread( &data, sizeof(STRTEST), 1, fp ); //读取一个数据块到变量data中。
注意,当结构体中定义的变量有指针类型时,在存储数据时,就不能按结构体进行存储了。
因为,指针变量中存储的是内存地址,而程序在不同环境运行时,所使用的内存地址是不同的,只存储内存地址,不能把真正的数据保存下来,所以,即使是正确读取到文件内容,也不能得到当时的结构体内存数据。因而,在存储结构体数据时,要根据结构体类型变量特点采用正确的方法进行存储,才能正确的读取。