C语言结构体与指针
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
可以用printf(“%x &a)查看其地 可以用printf(“%x \n” , &a)查看其地 注意,这个地址并不是始终不变的, 址。注意,这个地址并不是始终不变的,这是由 机器和操作系统来安排的,我们无法预先知道。 机器和操作系统来安排的,我们无法预先知道。
一、指针概述
2.指针变量: 指针变量: 指针变量 既然存储在内存中的各种变量都有一个地 址,我们能否这样设想:定义某种变量,让这个 我们能否这样设想:定义某种变量, 变量的值始终等于某个变量的地址, 变量的值始终等于某个变量的地址,如同某个房 间号、门牌号一样? 间号、门牌号一样? 这种存放某种变量 地址的变量称为指针变量。 地址的变量称为指针变量。
三、结构体类型
(3)结构体类型中的数据项,既可以是基本 )结构体类型中的数据项, 数据类型, 数据类型,也允许是另一个已经定义的结构 体类型。 体类型。 例如,本例代码中的结构体类型std_info,其 例如,本例代码中的结构体类型 , 数据项“ 数据项“birthday”就是一个已经定义的日期 就是一个已经定义的日期 结构体类型date。 结构体类型 。 个数据项称为结构体类型的1 (4)将1个数据项称为结构体类型的1个成 ) 或分量)。 员(或分量)。
例如, 例如,利用上例中定义的学生信息结构体 类型std_info,定义了一个相应的结构体 , 类型 变量student: : 变量 struct std_info student; 结构体变量student:拥有结构体类型的全部 : 结构体变量 成员,其中 成员,其中birthday成员是一个日期结构体类 成员是一个日期结构体类 个成员构成。 型,它又由3个成员构成。 它又由 个成员构成 注意:使用间接定义法定义结构体变量时, 注意:使用间接定义法定义结构体变量时,必 须同时指定结构体类型名。 须同时指定结构体类型名。
struct std_info /*学生信息结构体类型: 学生信息结构体类型: 学生信息结构体类型 由学号、姓名、性别和生日共 项组成 项组成*/ 由学号、姓名、性别和生日共4项组成 {char no[7]; char name[9]; char sex[3]; struct date birthday; };
二、指针变量
p P+1 P+2 P+3
1 2 3 4
p 2byte 3.14 P+1 2.12 4byte
二、指针变量
2、指针变量赋值(这里要用到取地址运算符“&”) 指针变量赋值(这里要用到取地址运算符“&”) 例: pointer_1 = &i; pointer_2 = &j; 注意(1)指针变量中只能存放地址,不能将一个非 注意( 指针变量中只能存放地址, 地址类型的数据(如常数等)赋给一个指针变量, 地址类型的数据(如常数等)赋给一个指针变量, 如:pointer_1 = 100; 也可以在定义指针变量的同时指定其初值, (2)也可以在定义指针变量的同时指定其初值, 如:int a; int *p = &a;
二、指针变量
1、定义指针变量: 、定义指针变量: 指针变量名1 指针变量名2, 数据类型 * 指针变量名 ,* 指针变量名 ,… ; 如: int *p, a = 3; 基类型, 基类型,即该指针变 int *q, b=5; 量所指向的变量的类
型 2010 10 2012 35
Βιβλιοθήκη Baidu
如何使一个指针变量指向另 外一个变量呢? 外一个变量呢? p=&a; q=&b;
因此, 语言中, 因此,在C语言中,将地 语言中 址形象化地称为指针 址形象化地称为指针 2010 2012
10 35 ….
2010 2012
a b
p q
一、指针概述
几点说明(系统对变量的访问形式分为两种 几点说明 系统对变量的访问形式分为两种) 系统对变量的访问形式分为两种 一个变量的访问(访问是指取出其值或向它赋值) 一个变量的访问(访问是指取出其值或向它赋值) 方式有两种: 方式有两种: (1)直接访问,通过变量名访问,如通过变量名 )直接访问,通过变量名访问,如通过变量名i 直接访问。 直接访问。 (2)间接访问,通过该变量的指针来访问,如通 )间接访问,通过该变量的指针来访问, 指针p访问变量 访问变量i。 过指针 访问变量 。
二、指针变量
使两个指针变量交换指向。 例: 使两个指针变量交换指向。 main( ) { int *p1, *p2, *p, a1=10, a2=20; p1=&a1; p2=&a2; printf(“%d , %d \n ” , *p1, *p2); p=p1; p1=p2; p2=p; printf(“%d , %d \n ” , *p1, *p2); }
三、结构体类型
C语言程序中少量变化的数据用变量来处 理。 批量同类型数据的处理用数组。 批量同类型数据的处理用数组。 不同类型的数据的集合用什么数据结构来 存放呢? 存放呢? 结构体类型
三、结构体类型
(一) 结构体类型定义 struct是结构体 struct 结构体类型名 /* struct是结构体 类型关键字* 类型关键字*/ 数据项1; {数据类型 数据项1; 数据类型 数据项2; 数据项2; …… …… 数据项n 数据类型 数据项n; 此行分号不能少! }; /* 此行分号不能少!*/
三、指针与函数
值传递和地址传递 值传递: 值传递:被调函数的形参作为被调函数的局部变 量处理,直接把实参的值复制给形参。 量处理,直接把实参的值复制给形参。值传递的 特点是被调函数对形参的任何操作都是作为局部 变量进行,不会影响主调函数的实参变量的值。 变量进行,不会影响主调函数的实参变量的值。
三、指针与函数
二、指针变量
3、指针变量的引用 、 取地址运算: 取地址运算:如: int *p , i=3, j=5; p=&i; /*让p其指向变量 */ 让 其指向变量 其指向变量i 对指针变量施加*运算,则代表取指针所指向的单 对指针变量施加 运算, 运算 元的内容。 元的内容。 这里, 与变量 是等价的。 与变量i是等价的 这里,*p与变量 是等价的。
补充内容: 补充内容:指针和结构体
指针是C语言中的重要概念,也是C 指针是C语言中的重要概念,也是C语言的重 要特色。 要特色。
掌握指针的概念、定义、指针变量的引用,掌 掌握指针的概念、定义、指针变量的引用, 握地址与指针的关系。 握地址与指针的关系。 掌握指针与函数的关系。 掌握指针与函数的关系。 掌握结构体类型变量的定义方法和引用方法。 掌握结构体类型变量的定义方法和引用方法。
void swap(int x,int y) { int temp; temp=x; x=y; y=temp; } void main() { int a,b; scanf("%d,%d",&a,&b); if(a<b) swap(a,b); printf("%d,%d\n",a,b); }
例:
void swap(int *x,int *y) { int temp; temp=*x; *x=*y; *y=temp; } void main() { int a,b; scanf("%d,%d",&a,&b); if(a<b) swap(&a,&b); printf("%d,%d\n",a,b); }
一、指针概述
1、地址的概念与取地址运算 内存以字节编码,每个编码都是一个地址。 内存以字节编码,每个编码都是一个地址。 我们怎样知道机器将某种数据放在内存的什么地 方呢?可用求地址运算符& 方呢?可用求地址运算符& 如:int &a a = 3 ; 就是变量在内存中的地址。 就是变量在内存中的地址。
三、结构体类型
例:定义一个反映学生基本情况的结构类型, 用以 定义一个反映学生基本情况的结构类型 存储学生的相关信息,由学号、姓名、 存储学生的相关信息,由学号、姓名、性别和生日 项组成。 共4项组成。 项组成 struct date 组成*/ 组成 {int year; int month; int day; }; /*生日结构体类型:由年、月、日三项 生日结构体类型:由年、 生日结构体类型
P2 &a2
a=*p1;*p1=*p2;*p2=a 交换后
二、指针变量
交换两个指针变量所指向的变量的值。 例: 交换两个指针变量所指向的变量的值。 main( ) { int *p1, *p2, a1, a2, a; a1=10; a2=20; p1=&a1; p2=&a2; a=*p1; *p1=*p2; *p2=a; printf(“a1= %d ,a2= %d \n ” , a1, a2); }
(二) 结构体变量定义 二 用户自己定义的结构体类型, 用户自己定义的结构体类型,与系统定义的标 准类型( 、 准类型 ( int、char等) 一样 , 可用来定义结构体 等 一样, 变量。 变量。 1.定义结构体变量的方法,可概括为两种: 定义结构体变量的方法,可概括为两种: 定义结构体变量的方法 先定义结构体类型、 (1)间接定义法──先定义结构体类型、再定 ) 先定义结构体类型 义结构体变量
值传递和地址传递 地址传递: 地址传递:被调函数的形参存放的是主调函数的实 参变量的地址, 参变量的地址,被调函数对形参的任何操作都被 处理成间接访问,正因为如此, 处理成间接访问,正因为如此,被调函数对形参 做的任何操作都影响了主调函数中的实参变量。 做的任何操作都影响了主调函数中的实参变量。
例:
a1
a1 a2
3 5
P1 &a1
*p2 a2
3 5
P1 &a2
P2 &a2 交换前
P2 &a1 交换后
*p1
P=p1;p1=p2;p2=p
下面表示p1和p1交换所指内容 下面表示 和 交换所指内容
a1 *p1 a2 *p2 a1
3 5
P1 &a1
*p1 a2 *p2
5 3
P1 &a1
P2 &a2 交换前
a b
….
2010 2012 p q
二、指针变量
为什么要为指针变量定义类型: 为什么要为指针变量定义类型: 不同的数据类型, char仅占一个字节 仅占一个字节、 不同的数据类型,如char仅占一个字节、int 占两个字节、float型占三个字节 型占三个字节, 占两个字节、float型占三个字节,而内存又是以字 节为单位进行地址编号,因而对char型,只要地址 节为单位进行地址编号,因而对char型 只要地址 char 数加减1 取出的数据就是char型的完整数据。 char型的完整数据 数加减1,取出的数据就是char型的完整数据。对 int型 要取出其中的数据需2字节, int型,要取出其中的数据需2字节,就不能对地址 进行简单的加减1 怎样取出一个完整的int int型数 进行简单的加减1了。怎样取出一个完整的int型数 据或float型数据呢? float型数据呢 据或float型数据呢?如果能够将指针变量也定义为 具有同样的数据类型,那么对指针进行加1或减1 具有同样的数据类型,那么对指针进行加1或减1运 就是让指针移动相应基类型对应的字节数。 算,就是让指针移动相应基类型对应的字节数。
struct score
/*成绩结构体类型:由学号 成绩结构体类型: 成绩结构体类型
和三门成绩共4项组成 和三门成绩共 项组成*/ 项组成 {char no[7]; int score1; int score2; int score3; };
三、结构体类型
数据项” (1)“结构体类型名”和“数据项”的命名规 ) 结构体类型名” 则,与变量名相同。 与变量名相同。 (2)数据类型相同的数据项,既可逐个、逐行 )数据类型相同的数据项,既可逐个、 分别定义,也可合并成一行定义。 分别定义,也可合并成一行定义。 例如, 本案例代码中的日期结构体类型, 例如 , 本案例代码中的日期结构体类型 , 也可 改为如下形式: 改为如下形式: struct date {int year, month, day; };
二、指针变量
区分: 运算符在不同场合的作用 运算符在不同场合的作用, 区分:*运算符在不同场合的作用,编译器能够根据 上下文环境判别*的作用。 上下文环境判别 的作用。 的作用 int a,b,c; int * p; (*表示定义指针) 表示定义指针) 表示定义指针 p = &a; *p = 100; (*表示指针运算符) 表示指针运算符) 表示指针运算符 c = a * b; (*表示乘法运算符) 表示乘法运算符) 表示乘法运算符 printf(“%d \n” ,*p) ;