(八)C语言结构体和指针
指针也可以指向一个结构体变量。定义的一般形式为:
struct 结构体名 *变量名;
前面已经定义了一个结构体 stu:
struct stu
{
char *name;
int num;
char sex;
float score;
};
下面定义一个指向 stu 的指针变量 pstu:
struct stu *pstu;
当然在定义结构体的同时也可以定义 pstu:
struct stu{
char *name;
int num;
char sex;
float score;
} *pstu, stu1, stu2;
pstu 可以指向结构体变量:
pstu = &stu1;
pstu = &stu2;
应该把结构体变量的首地址赋给 pstu,而不能把结构体名赋给 pstu,而且结构体变量前面要加取地址符&。下面的写法都是错误的:
pstu = &stu;
pstu = stu1;
结构体名和结构体变量是两个不同的概念,不能混淆。结构体名只能表示一个结构形式,是一种数据类型,编译器并不对它分配内存空间,就像 int、float 这些关键字本身不分配内存一样。只有当一个变量被定义为这种数据类型时,才对该变量分配内存空间。所以上面 &stu 这种写法是错误的,不可能去取一个结构体名的首地址。
另外,不要认为结构体和数组类似,数组名表示数组的首地址,而结构体变量不表示首地址,它表示的是结构体本身这块内存空间的整体。就像int a;,a 不是首地址,而是表示它本身。
有了结构体指针,就可以获取结构体成员了,一般形式为:
或者:
例如:
(*pstu).num
或者:
pstu->num
注意(*pstu)两侧的括号不可少,因为成员符.的优先级高于*。如去掉括号写作*pstu.num,那么等效于*(pstu.num),这样意义就完全不对了。
【示例】结构体指针变量的使用。
#include <stdio.h>
struct stu{
char *name;
int num;
char sex;
float score;
} *pstu, stu1 = {"He fang", , 'F', 92.5};
int main(){
pstu = &stu1;
printf("Number=%d, Name=%s\n",stu1.num, stu1.name);
printf("Sex=%c, Score=%f\n\n",stu1.sex, stu1.score);
printf("Number=%d, Name=%s\n",(*pstu).num, (*pstu).name);
printf("Sex=%c, Score=%f\n\n",(*pstu).sex, (*pstu).score);
printf("Number=%d, Name=%s\n",pstu->num, pstu->name);
printf("Sex=%c, Score=%f\n",pstu->sex, pstu->score);
return ;
}
运行结果:
Number=1, Name=He fang
Sex=F, Score=92.500000
Number=1, Name=He fang
Sex=F, Score=92.500000
Number=1, Name=He fang
Sex=F, Score=92.500000
(八)C语言结构体和指针的更多相关文章
- C语言结构体和指针
指针也可以指向一个结构体,定义的形式一般为: struct 结构体名 *变量名; 下面是一个定义结构体指针的实例: struct stu{ char *name; //姓名 int num; //学号 ...
- 关于C语言结构体,指针,声明的详细讲解。——Arvin
关于结构体的详细分析 只定义结构体 struct Student { int age; char* name; char sex;//结构体成员 };//(不要忘记分号) Student是结构体的名字 ...
- c语言结构体&常指针和常量指针的区别
结构体: 关系密切但数据类型不尽相同, 常指针和常量指针的区别: char * const cp : 定义一个指向字符的指针常数,即const指针,常指针. const char* p : 定义一个指 ...
- c语言结构体指针初始化
今天来讨论一下C中的内存管理. 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以前做二叉树算法时,他的左 ...
- c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针
1.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.1结构体成员指针未初始化 struct stude ...
- C语言结构体指针初始化(转)
reference: https://www.cnblogs.com/losesea/archive/2012/11/15/2772526.html 今天来讨论一下C中的内存管理. 记得上周在饭桌上和 ...
- 将c语言的结构体定义变成对应的golang语言的结构体定义,并将golang语言结构体变量的指针传递给c语言,cast C struct to Go struct
https://groups.google.com/forum/#!topic/golang-nuts/JkvR4dQy9t4 https://golang.org/misc/cgo/gmp/gmp. ...
- 读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组
原文链接:C语言结构体里的成员数组和指针 复制例如以下: 单看这文章的标题,你可能会认为好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Lar ...
- C语言结构体指针(指向结构体的指针)详解
C语言结构体指针详解 一.前言 一个指向结构体的变量的指针表示的是这个结构体变量占内存中的起始位置,同样它也可以指向结构体变量数组. *a).b 等价于 a->b. "."一 ...
随机推荐
- tomcat 启动时参数设置说明
使用Intellij idea 其发动tomcat时会配置启动vm options :-Xms128m -Xmx768m -XX:PermSize=64M -XX:MaxPermSize=512m. ...
- hibernate 对应关系级联的意思
hibernate的关联关系,重点在理解级联cascade和inverse 1.cascade一般用在级联保存,级联更新,级联删除上 1.1cascade注解有两种,一种是基于hibernate注解 ...
- c# monitor锁
当多个线程在并发的时候,难免会碰到相互冲突的事情,比如最经典的ATM机的问题,并发不可怕,可怕的是我们没有能力控制. 线程以我的理解可以分为三种 ① 锁. ② 互斥. ③ 信号. 好,这一篇主要整理“ ...
- PHP下的购物车
导航 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta h ...
- Java中的ClassLoader
Java中类的加载过程(如Dog类): 通过类型信息定位Dog.class文件. 载入Dog.class文件,创建相应的Class对象. 执行父类的静态字段定义时初始化语句和父类的静态初始化块 ...
- jquery 判断checkbox是否为空的三种方法
//方法一: if ($("#checkbox-id")get(0).checked) { // do something } //方法二:也适用于单选按钮 if($('#chec ...
- 【20160924】GOCVHelper MFC增强算法(5)
CString ExportListToExcel(CString sExcelFile,CListCtrl* pList, CString strTitle) { CStr ...
- readDouble
readDouble是从一个文件中读取double类型的数据
- 2016 Al-Baath University Training Camp Contest-1 C
Description Rami went back from school and he had an easy homework about bitwise operations (and,or, ...
- AIM Tech Round 3 (Div. 2) A
Description Kolya is going to make fresh orange juice. He has n oranges of sizes a1, a2, ..., an. Ko ...