C语言结构体与指针PPT课件
合集下载
全的C语言指针详解PPT课件
在函数中使用指针参数
03
使用指针参数来访问和修改指针所指向的内容,需要使用“-
>”或“*”运算符。
05
指针的高级应用
指向指针的指针(二级指针)
定义与声明
二级指针是用来存储另一个指 针的地址的指针。在声明时, 需要使用`*`操作符来声明二级
指针。
初始化与使用
通过使用`&`操作符获取一个指 针的地址,并将该地址存储在 二级指针中。然后,可以通过 二级指针来访问和操作原始指
当使用malloc或calloc等函 数动态分配内存后,如果 不再需要该内存,必须使 用free函数释放它。否则, 指针将指向一个无效的内 存地址。
当一个指针在函数中定义 ,但该函数返回后仍然存 在并继续指向无效的内存 地址时,就会产生野指针 。
避免指针越界访问
总结词:指针越界访问是指试图访问数 组之外的内存,这是不安全的,可能会 导致程序崩溃或产生不可预测的结果。
指针与内存分配
通过指针来访问和操作动态分配的内存空间。指针可以 存储动态分配的内存地址,并用于读取和写入该地址中 的数据。
指向结构体的指针
01
定义与声明
指向结构体的指针是指向结构体类型的指针。在声明时,需要使用结
构体类型的名称来声明指向结构体的指针。
02 03
初始化与使用
通过使用`&`操作符获取结构体的地址,并将该地址存储在指向结构 体的指针中。然后,可以通过该指针来访问和操作结构体中的成员变 量。
```
பைடு நூலகம்
指向数组元素的指针
• 指向数组元素的指针是指向数组中某个具体元素的指针。通过将指针指向数组中的某个元素,可以访问该 元素的值。
• 指向数组元素的指针可以通过定义一个指向具体元素的指针来实现。例如,定义一个指向数组中第三个元 素的指针,可以使用以下代码
C语言完整 ppt课件
1.4.1 宏定义
用一个标识符来表示一个字符串,称为“宏”,标识符称为“宏名”。在 程序中 用宏名替代字符串称为“宏调用”。在编译预处理时,将对程序中所有出现的 “宏 名”,都用宏定义中的字符串代换,这个过程称为“宏展开”。
1.4.1.1 不带参数的宏定义
格式为:#define 标识符 字符串
1.4.1.2 带参数的宏定义
1-4
1.3 C程序上机步骤
C源程序编好后,要经过编辑、编译、连接, 生成可执行文件后,才可运行。
运行集成开发软件
编辑源程序
编译
有 有错? 无 连接
不正确
运行
结果正确? 正确
结束
1-5
1.4 编译预处理
编译预处理是指,在C编译程序对C源程序进行编译之前,由编译预处理程 序对源程序中的预处理命令进行处理的过程。
1.2.1 C语言程序举例
1.2.2 C语言程序的结构
1.2.2.1 函数是C语言程序的基本单位。
1.2.2.2 函数的一般结构
任何函数(包括main()函数)都是由函数首部和函数体两部分组成。
1. 函数首部: 函数首部即函数第一行,由函数类型、函数名和函数参数表三部分组成。
2. 函数体: 函数体为函数首部下面的花括号{……}内的部分。 函数体一般由声明部分和执行部分构成:声明部分定义所用到的变量,声明所调用的函数等; 执行部分有若干语句组成。
2.6.1 运算符及表达式简介 2.6.1.1 运算符
C语言中的运算符具有2个特点: ⑴ 运算符的优先级 C语言中,运算符的优先级共分为15级,1级最高,15级最低。 ⑵ 运算符的结合性 C语言中各运算符的结合性分为左结合性(从左到右)和右结合性(从右到左)。 2.6.1.2 表达式 表达式是由常量、变量、函数和运算符组成的式子。 表达式求值是按运算符的优先级和结合性规定的顺序进行的。
用一个标识符来表示一个字符串,称为“宏”,标识符称为“宏名”。在 程序中 用宏名替代字符串称为“宏调用”。在编译预处理时,将对程序中所有出现的 “宏 名”,都用宏定义中的字符串代换,这个过程称为“宏展开”。
1.4.1.1 不带参数的宏定义
格式为:#define 标识符 字符串
1.4.1.2 带参数的宏定义
1-4
1.3 C程序上机步骤
C源程序编好后,要经过编辑、编译、连接, 生成可执行文件后,才可运行。
运行集成开发软件
编辑源程序
编译
有 有错? 无 连接
不正确
运行
结果正确? 正确
结束
1-5
1.4 编译预处理
编译预处理是指,在C编译程序对C源程序进行编译之前,由编译预处理程 序对源程序中的预处理命令进行处理的过程。
1.2.1 C语言程序举例
1.2.2 C语言程序的结构
1.2.2.1 函数是C语言程序的基本单位。
1.2.2.2 函数的一般结构
任何函数(包括main()函数)都是由函数首部和函数体两部分组成。
1. 函数首部: 函数首部即函数第一行,由函数类型、函数名和函数参数表三部分组成。
2. 函数体: 函数体为函数首部下面的花括号{……}内的部分。 函数体一般由声明部分和执行部分构成:声明部分定义所用到的变量,声明所调用的函数等; 执行部分有若干语句组成。
2.6.1 运算符及表达式简介 2.6.1.1 运算符
C语言中的运算符具有2个特点: ⑴ 运算符的优先级 C语言中,运算符的优先级共分为15级,1级最高,15级最低。 ⑵ 运算符的结合性 C语言中各运算符的结合性分为左结合性(从左到右)和右结合性(从右到左)。 2.6.1.2 表达式 表达式是由常量、变量、函数和运算符组成的式子。 表达式求值是按运算符的优先级和结合性规定的顺序进行的。
快速学会数据结构中的指针和结构体-PPT文档资料
• 学号(num):int型 • 姓名(name):char [ ] 型 • 性别(sex):char型 • 年龄(age):int型 • 分数(score):float型
解决办法
• 定义一个结构体类型 当已有的类型满足不了需要时,C语言规定可
以由用户自定义数据类型。 struct student {
char}abdirdtrh[d3a0y];; stu2=stu1; ( ) }stu1,st}us2tu; 1,stu2;
• 结构体变量的初始化
– 形式一:
struct 结构体名 {
类型标识符 成员名; 类型标识符 成员名;
……………. };
例 struct ssttruudcet n结t 构体名 结构体变量={初始数据}; { int num; char name[20]; char sex; int age; char addr[30]; };
– 引用规则 • 结构体变量不能整体引用,只能引用变量成员
引用方式: 结构体变量名.成员名
例例{}stsrt{suut1rciut,ccifcnsn可结赋lhhhctottiutaaaccifsann例n以构ltahh2值rrrotut{tug;aasasasdn将体teanmrrsect或du{e;ugitaxocsssnd例;rdn一嵌enmtmh;recurtr存et;eaxoa例iu[;cniie个套;nm;rr3nnnt[cte取t02ttutn{}se时结;s]0mstdym[a;trtd]2{}s以eaum逐构uu;ots;0aaydrt1nc]teru;u及级体eit,;eccifct[;nsn1lhnc2hhh成优结totit,引变tccifc;t0up运aaasnsanlnhhht]art2orrr员先合tttu;ui用量uaaasg;an算sasntda2rrrenmtt级性(ecudsufg赋(e;分;axo(sastdd;ne)nm“eucm;::rde;%r值t量从axoe只n11d;n[em;;ru.3drt[b给e)左m,02[能运e%;i3]0r[另向;02ts]算对h,;]0%n;一右d]符a;c最sams,个ty%tsusuet.t1低um1u结d.m1.s1,i…a%co.f.os级构g(noncsn…erfutot,+teum体%rhh的.++1.e===;==sb变1\s18=成nidt0r52su”a;量tt.2;,5huys员.(;dt2suc)a)o1进yr)y;ee;a行r ()
解决办法
• 定义一个结构体类型 当已有的类型满足不了需要时,C语言规定可
以由用户自定义数据类型。 struct student {
char}abdirdtrh[d3a0y];; stu2=stu1; ( ) }stu1,st}us2tu; 1,stu2;
• 结构体变量的初始化
– 形式一:
struct 结构体名 {
类型标识符 成员名; 类型标识符 成员名;
……………. };
例 struct ssttruudcet n结t 构体名 结构体变量={初始数据}; { int num; char name[20]; char sex; int age; char addr[30]; };
– 引用规则 • 结构体变量不能整体引用,只能引用变量成员
引用方式: 结构体变量名.成员名
例例{}stsrt{suut1rciut,ccifcnsn可结赋lhhhctottiutaaaccifsann例n以构ltahh2值rrrotut{tug;aasasasdn将体teanmrrsect或du{e;ugitaxocsssnd例;rdn一嵌enmtmh;recurtr存et;eaxoa例iu[;cniie个套;nm;rr3nnnt[cte取t02ttutn{}se时结;s]0mstdym[a;trtd]2{}s以eaum逐构uu;ots;0aaydrt1nc]teru;u及级体eit,;eccifct[;nsn1lhnc2hhh成优结totit,引变tccifc;t0up运aaasnsanlnhhht]art2orrr员先合tttu;ui用量uaaasg;an算sasntda2rrrenmtt级性(ecudsufg赋(e;分;axo(sastdd;ne)nm“eucm;::rde;%r值t量从axoe只n11d;n[em;;ru.3drt[b给e)左m,02[能运e%;i3]0r[另向;02ts]算对h,;]0%n;一右d]符a;c最sams,个ty%tsusuet.t1低um1u结d.m1.s1,i…a%co.f.os级构g(noncsn…erfutot,+teum体%rhh的.++1.e===;==sb变1\s18=成nidt0r52su”a;量tt.2;,5huys员.(;dt2suc)a)o1进yr)y;ee;a行r ()
软件技术基础之指针和结构体课件ppt课件
变
从右图可知,指 针变量和一般变量一 指针变量pi 变量地址(指针)
量 地 址
样,仅仅是变量旳内
指
存
向
入
容为变量地址旳变量
变量i
变量值
指
而已。这里变量和指针变量旳类型必须一致。
针 变
量
一般而言,指针变量只能存储某一种数据类型旳 变量旳地址,由此可将指针变量分为:整型指针变量、 实型指针变量和字符型指针变量等等,指针变量旳类 型表白了其指向旳存储单元中存储旳数据旳类型。
另一种引用旳形式: 构 造指针变量名 组员名 定义:struct data * today; today 为指向该构造旳指针
可见,“”和“·”操作符分别使用在用指向构造旳 指针和用构造变量来访问构造中旳数据项(组员)时。
例:构造例程。
结 构 体小结
构造体是C语言中旳一种复杂(构造)类型,它是一种 被命名为一种标识符旳多种变量旳集合。构造旳定义拟定了 构造变量或构造指针旳格式,构造是软件设计中实现数据抽 象旳基础。
3、程序中一旦定义了一种变量,该变量在内存中就将 占用一定旳存储单元。变量占用旳存储单元总是n(n>0) 个连续旳字节,开始字节旳地址,就是变量旳地址也可 称为该存储单元旳首地址。
二、指针旳基本概念:
指针就是变量旳地址。与此相应,在C语言中使
用一类专门旳变量即指针变量来存储变量旳地址。
所以,指针变量是存储地址数据旳变量。
四、指针旳“&”、“*”和赋值运算:
1 、& 取地址运算和 * 引用运算 取地址运算符&旳作用是取变量旳地址。如:
& i 表达求变量 i 旳地址。 引用运算符 * 旳作用是取指针指向变量旳内容。
《C语言》指针--ppt课件全文
说明: 这种方法可能会破坏系统的正常
工作状态,因为temp是一个指针变量 b 59
但是在函数中并没有给temp一个确定 的地址,这样它所指向的内存单元是 不可预见的,而对*temp的赋值可能 带来危害
swap2 &a p1
&b p2 随机值 temp
5?
ppt课件
11
例 6. 3 ③ #include <stdio.h> void swap3( int *p1, int *p2) { int *p;
p
*p = 12 ; printf (“%d\n” , *p ) ;
对a 重新赋值 等价于 a=12
2. & 与*
p =ห้องสมุดไป่ตู้&a ;
1010 152 a
&*p &(*p) &a *&a *(&a) *p a
ppt课件
6
3. *与 ++ , - -
int a = 2 , b = 5 , c , d , *p ; (1) p = &a ;
② 形参表列: 即指针变量所指向的函数的形参表列 ③ 格式中的小括号不能省略 2. 应用 (1) 让指针变量指向函数 pt = add ; 因为函数名为函数的入口地址, 所以直接将函数名 赋给指针变量即可 (2) 使用指针变量调用函数 格式 : (*指针变量名) ( 实参表列)
ppt课件
17
例 求一维数组中全部元素的和
因此我们可以定义一个指针变量, 让它的值等于 函数的入口地址, 然后可以通过这个指针变量来调用 函数, 该指针变量称为指向函数的指针变量
ppt课件
16
指向函数的指针变量
c语言中指针用法PPT演示课件
VS
通过指针遍历数组
使用指针进行数组遍历比使用下标遍历更 加灵活,可以通过调整指针来访问数组中 的任意元素。如通过`for(p=arr; p<arr+5; p)`可以遍历数组中的所有元素 。
03
指针与数组
数组指针的概念
数组指针
用于存储数组地址的指针变量 。
数组指针的类型
int *p; char *p; float *p; double *p;
动态内存分配
• 概念定义:动态内存分配是指在程序运行时根据需要动态地分配内存空间,以存储数据或对象。 • 用途:在需要根据输入或运行时需求动态扩展或缩减内存时,使用动态内存分配更加灵活和高效。 • 示例代码 • int p = (int)malloc(sizeof(int)); // 动态分配一个int类型的内存空间 • if (p != NULL) { • *p = 10; // 在分配的内存空间中存储数据 • printf("%d • ", *p); // 输出10 • free(p); // 释放内存空间 •} • · 概念定义:动态内存分配是指在程序运行时根据需要动态地分配内存空间,以存储数据或对象。 • · 用途:在需要根据输入或运行时需求动态扩展或缩减内存时,使用动态内存分配更加灵活和高效。 • · 示例代码 • · ```c
感谢观看
指针与结构体
• 概念定义:指针可以与结构体结合使用,以方便地访问结构体中的成员变量。 • 用途:结构体通常用于组织多个不同类型的数据,使用指针访问结构体成员可以更好地利用内存空间,并
提高访问效率。 • 示例代码 • struct student { • char name[20]; • int age; • }; • struct student stu = {"Tom", 18}; • struct student *p = &stu; • printf("%s %d • ", p->name, p->age); // 输出"Tom 18" • · 概念定义:指针可以与结构体结合使用,以方便地访问结构体中的成员变量。
《C语言指针》课件
参考资料
1 C语言指针基础知识 3 《C和指针》
2 《C Primer Plus》 4 代码示例
指针的操作
1
取地址操作符&
使用取地址操作符&可以获取变量的内存地
指针变量的初始化
2
址。
可以使用已存在的变量的地址来初始化一个
指针变量。
3
指针的引用操作符*
使用指针的引用操作符*可以获取该指针指
指针变量的赋值
4
向的数据。
可以将一个指针赋值为另一个指针或者将一 个指针赋值为一个变量的地址。
指针的应用
const关键字可以用于指针的 定义,防止指针修改指向的 数据。
总结
指针的优点与风险
指针提供了灵活和高效的数据 访问和操作方式,但不正确使 用可能导致内存错误。
指针的学习方法
理解基本概念后,通过实践、 阅读相关资料和解决问题来深 入学习指针。
练习题目
通过编写各类指针相关的练习 题目,巩固和加深对指针的理 解。
数组和指针
指针和数组之间有着密切的关系,可以通过指针来访问和操作数组元素。
指针与函数
指针可以作为函数的参数或返回值,实现更灵活的函数调用和数据交互。
动态内存分配
使用指针和动态内存分配函数,可以灵活地动态创建和释放内存。
指针的高级应用
指向指针的指针
指向指针的指针可以用于多级数据 结构的访问和管理。
指向函数的指针
通过指向函数的指针,可以动态选 择和调用不同的函数。
回调函数
回调函数是指将一个函数作为参数 传递给另一个函数,在特定事件发 生时被调用。
指针的注意事项
1 悬空指针和野指针
2 内存泄漏
C语言程序设计——指针(完整版)PPT教学课件
说明:
(1)设有指向整型变量的指针变量p,若要把整型变量a 的地址赋予p,有以下方式: 指针变量初始化的方法: int a; int *p=&a; 赋值语句的方法: int a,*p; p=&a; (2)指针运算符*和指针变量说明中的指针说明符*不是 一回事。后者表示其后的变量是指针类型,前者则是一 个运算符用以表示指针变量所指的变量。
三、 指针变量作函数参数 C语言是通过传值将参数传递给函数的,对被调函数来说, 没有直接的方法来改变主调函数内的变量的值。 例:对两个整数按大小顺序输出。 #include<stdio.h> swap(int x,int y) {int t; t=x; x=y; y=t; } void main( ) {int a=3,b=5; if(a<b) swap(a,b); printf(“a=%d,b=%d \n”,a,b); }
说明:
(1)指针变量名的构成原则是标识符,前面必须有 “*”, 表示该变量的类型是指针型变量。 (2)在一个定义语句中,可以同时定义普通变量、数组、 指针变量。 (3)类型说明符说明的数据类型不是指针变量中存放的 数据的数据类型,而是它将要指向的变量或数组的数据 类型。因此,一个指针变量只能用来指向同种数据类型 的其他变量或数组,不能时而指向一个浮点型变量,时 而指向一个整型变量。
说明:
(3)如果已执行了语句p=&a; ,则: &*p:先进行*p的运算,即是变量a,再执行&运算, 即变量a的地址。因此&*p与&a相同。 *&a:先进行&a的运算,即得a的地址,再执行*运 算, 即&a所指向的变量,即变量a。 因此*&a与a相同。
精品-清华大学C语言课件 第13章01 结构体指针
struct Student* pStruct;/*定义结构体类型指针*/ pStruct=&student;/*指针指向结构体变量*/ printf("-----学生信息-----\n");/*消息提示*/ printf(“姓名: %s\n”,(*pStruct).cName);使用指针引用变量中的成员*/ printf("学号: %d\n",(*pStruct).iNumber); printf("性别: %s\n",(*pStruct).cSex); printf("年级: %d\n",(*pStruct).iGrade); return 0; }
【例13.2】 使用指向运算符引用结构体对象成员。 在本实例中,定义结构体变量但不为其进行初始化操作,使用指针指向结构体变量并为其成员进行赋值操作。
#include<stdio.h> #include<string.h>
struct Student/*学生结构*/ { char cName[20];/*姓名*/ int iNumber;/*学号*/ char cSex[3];/*性别*/ int iGrade;/*年级*/ }student;/*定义变量*/
pStruct ->成员名;
这种方法使用的是指向运算符,例如使用指向运算符引用一个变量的成员:
pStruct->iNumber=12061212;
假如student为结构体变量,pStruct为指向结构体变量的指针,可以看出以下三种形式的效果是等价的:
student.成员名 (*pStruct).成员名 pStruct->成员名
Display(student.fScore[0]);
【例13.2】 使用指向运算符引用结构体对象成员。 在本实例中,定义结构体变量但不为其进行初始化操作,使用指针指向结构体变量并为其成员进行赋值操作。
#include<stdio.h> #include<string.h>
struct Student/*学生结构*/ { char cName[20];/*姓名*/ int iNumber;/*学号*/ char cSex[3];/*性别*/ int iGrade;/*年级*/ }student;/*定义变量*/
pStruct ->成员名;
这种方法使用的是指向运算符,例如使用指向运算符引用一个变量的成员:
pStruct->iNumber=12061212;
假如student为结构体变量,pStruct为指向结构体变量的指针,可以看出以下三种形式的效果是等价的:
student.成员名 (*pStruct).成员名 pStruct->成员名
Display(student.fScore[0]);
04-课件:结构指针
}
结构体指针
分析程序的运算结果: 结构数组 array 的初始化后的状态如下。
p
array[0]
100
array[1]
200
array[2]
300
array[3]
400
array[4] 500
10 data[0] 20 data[1] 30 data[2] 40 data[3] 50 data[4]
int data[5]={10,20,30,40,50,};/* data: 整型数组 */
Hale Waihona Puke struct s array[5]={100,&data[0],200,&data[1],
300,&data[2],400,&data[3],500,&data[4]
};
/* array: 结构数组 */
main ( )
pdate->year = 1963;
等价于:
today.year = 1963;
(* pdate).year = 1963; /* 必须加括号 */
结构体指针
例:分析程序的运算结果
struct s
{
int x, *y;/* y: 结构中的成员是指向整型的指针 */
} * p; /* p: 指向结构的指针 */
p指向下一个变量的成员 x
结构体指针
4、指针运算与++运算规律小结 由运算符的优先级和结合性决定++操作的对象; 由++的前缀/后缀形式,决定操作的时机。
++p->x ++ * p->y * ++ p->y *(++p)->y
C语言的指针和结构体PPT课件
void main ()
{ int a=1, b=2 , *p1 , *p2 , *pt; a = 1; b = 2; *p1 = 1, *p2 = 2
p1 = &a ; p2 = &b;
a = 1; b = 2; *p1 = 2, *p2 = 1
printf ("a=%d, b=%d, *p1=%d, *p2=%d\n", a, b, *p1, *p2);
& : 取地址运算符,给出变量的地址。
int *p, a = 3;
p = &a; 把 a 的地址赋给 p,即 p 指向 a
p
a
&a
3
*p
//指针变量的类型和它所指向变量的类型相同
* :间接访问运算符,访问指针所指向的变量。
*p:指针变量 p 所指精向选P的PT课变件 量。
4
p
a
说明 int a = 3, *p;
(2) 在被调函数中,用指针类型形参接受该变量的地址
(3) 在被调函数中,改变精形选P参PT课所件指向变量的值
8
数组和地址间的关系
int a[100], *p; 数组名代表一个地
地址 内容
址,它的值是数
a 3000
组首元素的地址 a+1 3002
(基地址)
a+i 是距数组a的
a+i
基地址的第i个偏 移
地址 内容 数组元素
p = a;
p a 3000
a[0]
或
p+1 a+1 3002
a[1]
p = &a[0];
p+i a+i
a[i]
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
区分:*运算符在不同场合的作用,编译器能够根据 上下文环境判别*的作用。 int a,b,c; int * p; (*表示定义指针) p = &a; *p = 100; (*表示指针运算符) c = a * b; (*表示乘法运算符) printf(“%d \n” ,*p) ;
二、指针变量
例: 使两个指针变量交换指向。 main( )
(2)也可以在定义指针变量的同时指定其初值, 如:int a;
int *p = &a;
二、指针变量
3、指针变量的引用
取地址运算:如: int *p , i=3, j=5;
p=&i; /*让p其指向变量i */
对指针变量施加*运算,则代表取指针所指向的单
元的内容。 这里,*p与变量i是等价的。
二、指针变量
二、指针变量
p
p 1 2byte
P+1
2
P+2
3
P+1
P+3
4
3.14 4byte 2.12
二、指针变量
2、指针变量赋值(这里要用到取地址运算符“&”) 例: pointer_1 = &i;
pointer_2 = &j; 注意(1)指针变量中只能存放地址,不能将一个非
地址类型的数据(如常数等)赋给一个指针变量, 如:pointer_1 = 100;
变量的值始终等于某个变量的地址,如同某个房
间号、门牌号一样?
这种存放某种变量 地址的变量称为指针变量。
因此,在C语言中,将地 址形象化地称为指针
2010 10
a
2012 35
b
….
2010 p 2012 q
一、指针概述
几点说明(系统对变量的访问形式分为两种) 一个变量的访问(访问是指取出其值或向它赋值)
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); }
*p2 3
P1 &a2
a2 5
P2 &a2
a2
5
*p1
P2 &a1
交换前 P=p1;p1=p2;p2=p 交换后
下面表示p1和p1交换所指内容
a1
*p1 3
P1 &a1
a1
*p1 5
P1 &a1
a2
5
*p2
P2 &a2
a23ຫໍສະໝຸດ *p2P2 &a2
交换前 a=*p1;*p1=*p2;*p2=a 交换后
二、指针变量
三、结构体类型
C语言程序中少量变化的数据用变量来处 理。
批量同类型数据的处理用数组。 不同类型的数据的集合用什么数据结构来
存放呢? 结构体类型
三、结构体类型
(一) 结构体类型定义
例: 交换两个指针变量所指向的变量的值。 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 *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);
}
a1 3
P1 &a1
a1
方式有两种: (1)直接访问,通过变量名访问,如通过变量名i
直接访问。 (2)间接访问,通过该变量的指针来访问,如通
过指针p访问变量i。
二、指针变量
1、定义指针变量:
数据类型 * 指针变量名1 ,* 指针变量名2,… ;
如: int *p, a = 3; int *q, b=5;
基类型,即该指针变 量所指向的变量的类
例:
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); }
例:
补充内容:指针和结构体
指针是C语言中的重要概念,也是C语言的重 要特色。
掌握指针的概念、定义、指针变量的引用,掌 握地址与指针的关系。 掌握指针与函数的关系。 掌握结构体类型变量的定义方法和引用方法。
一、指针概述
1、地址的概念与取地址运算 内存以字节编码,每个编码都是一个地址。
我们怎样知道机器将某种数据放在内存的什么地 方呢?可用求地址运算符&
值传递和地址传递
值传递:被调函数的形参作为被调函数的局部变 量处理,直接把实参的值复制给形参。值传递的 特点是被调函数对形参的任何操作都是作为局部 变量进行,不会影响主调函数的实参变量的值。
三、指针与函数
值传递和地址传递 地址传递:被调函数的形参存放的是主调函数的实
参变量的地址,被调函数对形参的任何操作都被 处理成间接访问,正因为如此,被调函数对形参 做的任何操作都影响了主调函数中的实参变量。
如:int a = 3 ; &a 就是变量在内存中的地址。 可以用printf(“%x \n” , &a)查看其地 址。注意,这个地址并不是始终不变的,这是由 机器和操作系统来安排的,我们无法预先知道。
一、指针概述
2.指针变量: 既然存储在内存中的各种变量都有一个地
址,我们能否这样设想:定义某种变量,让这个
型
如何使一个指针变量指向另 2010 10
a
外一个变量呢?
2012 35
b
p=&a; q=&b;
….
2010 p 2012 q
二、指针变量
为什么要为指针变量定义类型: 不同的数据类型,如char仅占一个字节、int
占两个字节、float型占三个字节,而内存又是以字 节为单位进行地址编号,因而对char型,只要地址 数加减1,取出的数据就是char型的完整数据。对 int型,要取出其中的数据需2字节,就不能对地址 进行简单的加减1了。怎样取出一个完整的int型数 据或float型数据呢?如果能够将指针变量也定义为 具有同样的数据类型,那么对指针进行加1或减1运 算,就是让指针移动相应基类型对应的字节数。
二、指针变量
例: 使两个指针变量交换指向。 main( )
(2)也可以在定义指针变量的同时指定其初值, 如:int a;
int *p = &a;
二、指针变量
3、指针变量的引用
取地址运算:如: int *p , i=3, j=5;
p=&i; /*让p其指向变量i */
对指针变量施加*运算,则代表取指针所指向的单
元的内容。 这里,*p与变量i是等价的。
二、指针变量
二、指针变量
p
p 1 2byte
P+1
2
P+2
3
P+1
P+3
4
3.14 4byte 2.12
二、指针变量
2、指针变量赋值(这里要用到取地址运算符“&”) 例: pointer_1 = &i;
pointer_2 = &j; 注意(1)指针变量中只能存放地址,不能将一个非
地址类型的数据(如常数等)赋给一个指针变量, 如:pointer_1 = 100;
变量的值始终等于某个变量的地址,如同某个房
间号、门牌号一样?
这种存放某种变量 地址的变量称为指针变量。
因此,在C语言中,将地 址形象化地称为指针
2010 10
a
2012 35
b
….
2010 p 2012 q
一、指针概述
几点说明(系统对变量的访问形式分为两种) 一个变量的访问(访问是指取出其值或向它赋值)
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); }
*p2 3
P1 &a2
a2 5
P2 &a2
a2
5
*p1
P2 &a1
交换前 P=p1;p1=p2;p2=p 交换后
下面表示p1和p1交换所指内容
a1
*p1 3
P1 &a1
a1
*p1 5
P1 &a1
a2
5
*p2
P2 &a2
a23ຫໍສະໝຸດ *p2P2 &a2
交换前 a=*p1;*p1=*p2;*p2=a 交换后
二、指针变量
三、结构体类型
C语言程序中少量变化的数据用变量来处 理。
批量同类型数据的处理用数组。 不同类型的数据的集合用什么数据结构来
存放呢? 结构体类型
三、结构体类型
(一) 结构体类型定义
例: 交换两个指针变量所指向的变量的值。 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 *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);
}
a1 3
P1 &a1
a1
方式有两种: (1)直接访问,通过变量名访问,如通过变量名i
直接访问。 (2)间接访问,通过该变量的指针来访问,如通
过指针p访问变量i。
二、指针变量
1、定义指针变量:
数据类型 * 指针变量名1 ,* 指针变量名2,… ;
如: int *p, a = 3; int *q, b=5;
基类型,即该指针变 量所指向的变量的类
例:
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); }
例:
补充内容:指针和结构体
指针是C语言中的重要概念,也是C语言的重 要特色。
掌握指针的概念、定义、指针变量的引用,掌 握地址与指针的关系。 掌握指针与函数的关系。 掌握结构体类型变量的定义方法和引用方法。
一、指针概述
1、地址的概念与取地址运算 内存以字节编码,每个编码都是一个地址。
我们怎样知道机器将某种数据放在内存的什么地 方呢?可用求地址运算符&
值传递和地址传递
值传递:被调函数的形参作为被调函数的局部变 量处理,直接把实参的值复制给形参。值传递的 特点是被调函数对形参的任何操作都是作为局部 变量进行,不会影响主调函数的实参变量的值。
三、指针与函数
值传递和地址传递 地址传递:被调函数的形参存放的是主调函数的实
参变量的地址,被调函数对形参的任何操作都被 处理成间接访问,正因为如此,被调函数对形参 做的任何操作都影响了主调函数中的实参变量。
如:int a = 3 ; &a 就是变量在内存中的地址。 可以用printf(“%x \n” , &a)查看其地 址。注意,这个地址并不是始终不变的,这是由 机器和操作系统来安排的,我们无法预先知道。
一、指针概述
2.指针变量: 既然存储在内存中的各种变量都有一个地
址,我们能否这样设想:定义某种变量,让这个
型
如何使一个指针变量指向另 2010 10
a
外一个变量呢?
2012 35
b
p=&a; q=&b;
….
2010 p 2012 q
二、指针变量
为什么要为指针变量定义类型: 不同的数据类型,如char仅占一个字节、int
占两个字节、float型占三个字节,而内存又是以字 节为单位进行地址编号,因而对char型,只要地址 数加减1,取出的数据就是char型的完整数据。对 int型,要取出其中的数据需2字节,就不能对地址 进行简单的加减1了。怎样取出一个完整的int型数 据或float型数据呢?如果能够将指针变量也定义为 具有同样的数据类型,那么对指针进行加1或减1运 算,就是让指针移动相应基类型对应的字节数。