深圳大学C语音课件第八章-指针(第二部分)

合集下载

c语言程序设计教学课件-第8章2

c语言程序设计教学课件-第8章2
18
例8.13 将字符串第n个字符开始复制到另一数组中。
#include "string.h"
main( )
{ int i,n; char a[]=“computer”,b[10],*p,*q;
p=a; q=b;
scanf("%d",&n);
if(strlen(a)<n) printf("error!\n");
a[0][0] 1
a[1][0] 5
a[2][0] 9
a[i]+1
a[0][1] 2
a[1][1] 6
a[2][1] 10
a[i]+2
a[0][2] 3
a[1][2] 7
a[2][2] 11
a[i]+3
a[0][3] 4
a[1][3] 8
a[2][3] 12
二维数组的指针表示
10
例8.9 :
main( ) { int a[2][3]={1,2,3,4,5,6},i,j,k,*p;
for(j=0;j<4;j++) if(max<*(*p+j)) { max=*(*p+j);m=i;n=j; }
printf("max is:a[%d][%d]=%d\n",m,n,max); }
15
8.3.3 用指向数组的指针作函数参数
用数组名作参数有以下4种情况: (1)实参和形参都是数组名; (2)实参是数组名,形参是指针变量; (3)实参是指针变量,形参是数组名; (4)实参和形参都是指针变量。
8
因此,a[0],a[1] 分别代表2行的首地址,而a[0]又可 以表示为*(a+0),a[1]可表示为*(a+1)。因此元素a[i][j]的地 址可表示为a[i]+j或*(a+i)+j。而元素值则表示为*(a[i]+j)或 *(*(a+i)+j)。

《C语言第八章》PPT课件

《C语言第八章》PPT课件

精选PPT
7
8.2 指针变量
8.2.3 指针变量的引用
– 变量的数据访问形式
普通变量:变量名—变量存储的数据 指针变量:*变量名—指向存储单元存储的数据
– 定义时:*p表示为指针;使用时*p表示指针指向的数据
– 变量的地址访问形式
普通变量:&变量名—存储数据的首地址 指针变量:变量名—指向的存储单元
精选PPT
9
8.2 指针变量
8.2.3 指针变量的引用
– 指针和变量的几个换算关系:
对于变量,有:名称=数据、&名称=地址 对于指针,有:名称=地址、*名称=指向的数据ຫໍສະໝຸດ 若有定义:int a, *p 则:
– &a、p 是同一类型数据,为地址 –a、*p 是同一类型数据,为整型数据
一般情况下,使用p=&a的形式,让指针与变量关联, 使用*p的形式,访问指向的数据
– 指针变量:
存放指针的变量,称之为指针变量
– 指针变量里面存放的是指针,也就是地址
– 为什么使用指针
更方便、更主动的操作数据、构建数据结构
精选PPT
2
8.1 什么是指针
学习指针的几点建议
– 弄明白存放在内存中的数据是如何访问的
这是学习指针的基础
– 清晰的记住指针和变量的几个关系:
指针的内容,指针指向的内容等等
– 一般情况下,不要将地址值直接赋给指针变量
精选PPT
8
8.2 指针变量
8.2.3 指针变量的引用
– 一般情况下,不能将地址值直接赋给变量
若有 int a,*p; 则:&a=1000
p=2000是错误的
– 指针不会单独使用,常和其他普通变量关联在 一起使用

C语言指针PPT

C语言指针PPT
2023
c语言指针ppt
目 录
• 指针简介 • 指针的语法 • 指针的使用 • 指针的注意事项 • 指针常见错误 • 案例分析
01
指针简介
什么是指针
指针是一种数据类型
指针是C语言中的一种特殊数据类型,可以存储内存地址。
内存地址
指针所存储的内存地址通常是指向一个变量或数据的内存位 置。
指针的基本概念
指向函数的指针
指向函数的指针是指针变量中存储 了一个函数的入口地址。
指向指针的指针
指向指针的指针是指针变量中存储 了一个指针变量的地址。
02
指针的语法
指针的声明
指针的声明方法
使用 * 符号声明一个指针变量,例如:int *p; 表示声明一个指向整数的指针 变量 p。
指针变量的命名规范
指针变量的名称通常以 p_ 或 ptr_ 开头,以区分普通变量和指针变量。
05
指针常见错误
指针丢失
指针丢失是指在程序中忘记初始化指针,导致指针指向一个 随机的内存地址。
解决办法:在使用指针前,始终要对其进行初始化,可以将 其指向NULL或者一个有效的内存地址。
野指针
野指针是指指向无效内存区域的指针,这个内存区域没有 分配或者已经释放了。
解决办法:在释放内存后,立即将指针置为NULL,避免 其成为野指针。
指针的初始化
指针的初始化方法
使用 & 符号取变量的地址,然后将地址赋值给指针变量,例如:int a = 10; int *p = &a; 表示将变量 a 的地址赋值给指针变量 p。
空指针的初始化
使用 NULL 关键字初始化指针变量,例如:int *p = NULL; 表示将指针变量 p 初始化为空指针。

C语言程序设计第8章指针简明教程PPT课件

C语言程序设计第8章指针简明教程PPT课件
int main( ) (1) size of string's pointer is 4 byte =32 bits. { char str[ ]="abcdefghi", *ps =str; (2) size of int's pointer is 4 bytes =32 bits. int i =6,* pi =&i; (3) size of float's pointer is 4 bytes =32 bits. float f =6.4f, *pf =&f; (4) size of double's pointer is 4 bytes =32 bits. double d =3.1415926, *pd =&d; printf("(1) size of string‟s pointer is %d byte =%d bits.\n", sizeof( ps), 8 * sizeof( ps)); printf("(2) size of int‟s pointer is %d bytes =%d bits.\n", sizeof( pi), 8 * sizeof( pi)); printf("(3) size of float‟s pointer is %d bytes =%d bits.\n", sizeof( pf), 8 * sizeof( pf)); printf("(4) size of double‟s pointer is %d bytes =%d bits.\n", sizeof( pd), 8 * sizeof( pd)); return 0; }
d
图:变量内存分配示意图

《C语言指针》课件

《C语言指针》课件

参考资料
1 C语言指针基础知识 3 《C和指针》
2 《C Primer Plus》 4 代码示例
指针的操作
1
取地址操作符&
使用取地址操作符&可以获取变量的内存地
指针变量的初始化
2
址。
可以使用已存在的变量的地址来初始化一个
指针变量。
3
指针的引用操作符*
使用指针的引用操作符*可以获取该指针指
指针变量的赋值
4
向的数据。
可以将一个指针赋值为另一个指针或者将一 个指针赋值为一个变量的地址。
指针的应用
const关键字可以用于指针的 定义,防止指针修改指向的 数据。
总结
指针的优点与风险
指针提供了灵活和高效的数据 访问和操作方式,但不正确使 用可能导致内存错误。
指针的学习方法
理解基本概念后,通过实践、 阅读相关资料和解决问题来深 入学习指针。
练习题目
通过编写各类指针相关的练习 题目,巩固和加深对指针的理 解。
数组和指针
指针和数组之间有着密切的关系,可以通过指针来访问和操作数组元素。
指针与函数
指针可以作为函数的参数或返回值,实现更灵活的函数调用和数据交互。
动态内存分配
使用指针和动态内存分配函数,可以灵活地动态创建和释放内存。
指针的高级应用
指向指针的指针
指向指针的指针可以用于多级数据 结构的访问和管理。
指向函数的指针
通过指向函数的指针,可以动态选 择和调用不同的函数。
回调函数
回调函数是指将一个函数作为参数 传递给另一个函数,在特定事件发 生时被调用。
指针的注意事项
1 悬空指针和野指针
2 内存泄漏

C语言程序设计——指针(完整版)PPT教学课件

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相同。

第8章指针00002

第8章指针00002
(2)*&a的含义是a。因为先进行&a运算,得到a的 地址,再进行*运算,即&a所向的变量,因此*&a 等价于a。
(3)(*p)++相当于a++。注意括号是必要的,如果 没有括号,就成为*(p++),这时使指针变量本身 增1,并不是使p所指的存储单元的值增1。
2.通过指针引用存储单元 例如: int *p, k=4, q;
8.4.3 指针比较
在关系表达式中,可以对两个指针进行比 较,即两个变量地址的比较。如:
p,q是两个指针变量,if(p<q) printf(“p points to lower than q.\n”);
通常,两个或两个以上的指针指向同一目 标时比较才有意义。
8.5.3 函数返回地址值
函数值的类型不仅可以是简单的数据类型,而且还可以 是指针类型。其一般形式为:
8.4 对指针变量的操作
8.4.1 通过指针来引用一个存储单元
1.取地址运算符(&)和指针运算符(*)
与指针有关的运算符主要有两个,分别是“取 地址运算符(&)”和“指针运算符(*)”。
(1)&运算符。为取地址运算符,其作用是返回操 作对象(变量或数组元素)的地址。例如,“&x;” 返回变量x的地址,“&a[5];”返回的是数组元素 a[5]的地址。
&b[5]: 得到的是数组元素b[5]的地址
在C语言中,指针被广泛应用,它和数组、 字符串、函数间数据的传递等有着密不可 分的联系。
8.2 指针变量的定义和指针变量的基类型 1.指针变量的定义与初始化
定义指针变量的一般形式为: 类型名 *指针变量名1,*指针变量名2,…;

C语言指针第讲PPT课件

C语言指针第讲PPT课件
int temp; temp = *x; *x = *y; *y = temp; }
temp
5
xy
&a
&b
ab
xy
第17页/共49页
简单变量作函数参数与指针变量作函数参数的比较
a
b
15
8
main
函数
Swap
函数
x
y
15
8
temp
a) 调用Swap函数
a
b
15
8
x②
8 ① temp 15
y 15

(b)执行Swap函数
主调函数
实参
main() {
int a, b; a = 15; b = 8; Swap(a, b); printf("a=%d,b=%d",a,b); }
a
b
5
9
形 参 被调函数
void Swap(int x, int y) {
int temp; temp = x; x = y; y = temp; }
为什么引入指针的概念
• 铁杆C/C++程序员最挚爱的武器:指针 • C/C++的高效、高能主要来自于指针 • 很多不可能的任务由指针完成
第1页/共49页
为什么引入指针的概念
• 指针 • 为函数提供修改变量值的手段 • 为C的动态内存分配系统提供支持 • 为动态数据结构(如例链表、队列、二叉树等)提供支持 • 可以改善某些子程序的效率
内存用户数据区
变量 i 变量 j 变量 k
变量 i_pointer
第3页/共49页
指针(Pointer)的概念
• 指针也是一种数据类型 • 指针变量
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
string
I l o v e C h i n a ! \0
9
string[0] string[1] string[2] string[3] string[4] string[5] string[6] string[7] string[8] string[9] string[10] string[11] string[12] string[13]
行指针 指向一维数组 的指针
列指针
a[2]+1 *(a+2)+1
2018
一级指针
指针 常量
2 【例】利用一级指针变量对二维数组的引用。
#include <stdio.h> void main ( ) { short int a[2][3] = {{1, 2, 3}, {4, 5, 6}}; short int i, j, *p; p = &a[0][0]; for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) printf ("a[%d][%d] = %d ", i, j, *(p + i*3 + j)); printf ("\n"); } }
字符串结束标志 pstr pstr[0] pstr[1] pstr[2]
'W' 'B' 'S' 'u' 'e' 'h' 'h' 'i' 'a' 'a' 'j' 'n' 'n' 'i' 'g' 0 'n' 'h' 'g' 'a' 0 'i' 0
【例】利用字符指针数组对一组城市名进行升序排列。
13
#include <stdio.h> for (i = 0; strcmp(pcity[i],"") != 0; i++) #include <string.h> printf ("%s ", pcity[i]); void main ( ) printf ("\n"); { } int i, j, k; char *pcity[ ] = {"Wuhan", Beijing","Shanghai", "Tianjin", "Guangzhou",""}; char *ptemp; 选择排序 for (i = 0; strcmp(pcity[i],"") != 0; i++) { k = i; for (j = i+1; strcmp(pcity[j],"") != 0; j++) if (strcmp(pcity[k], pcity[j]) > 0) k = j; if (k != i) { ptemp = pcity[i]; pcity[i] = pcity[k]; pcity[k] = ptemp; 运行结果: } Beijing Guangzhou Shanghai Tianjin Wuhan
8
2000 变量所 占内存 单元(不 一定连 续) 2010 2020 2030 2040
a
b c d e
p[0] p[1] p[2] p[3] p[4]
2000 2010 2020 2030 2040
指针数组p (占用连续的 存储单元)
注意:该方法是将a,b,c,d,e所对应的 内存单元的值进行交换,而指针数 组并无变化。
}
【例】利用二级字符指针来处理字符串组
#include <stdio.h> 注意:二级指针与指针数组的关系:int **p 与 int *q[10] #define NULL 0 指针数组名是二级指针常量; void main ( ) p = q; p + i 是q[i]的地址; { 系统只给p分配能保存一个指针值的内存区; char **p; char *name[ ] = {"hello", "good", "world", "bye", ""}; 而给q分配10块内存区,每块可保存一个指针值。 p = name + 1; printf ("%s ", *p); 运行结果: p += 2; 42003C:good bye while (**p != NULL) printf ("%s\n", *p++); } name[0] 'h' 'g' 'w' 'b' 0 'e' 'o' 'o' 'y' 'l' 'o' 'r' 'e' 'l' 'd' 'l' 0 'o' 0 'd' 0 0
14
p p p
name[1] name[2] name[3] name[4]
5 指针与动态内存分配
1、静态内存分配 内存中静态存储区: 静态局部变量、静态全局变量、 全局变量。 内存中动态存储区(栈区):局部变量(包括形参)。
int k; //系统将给变量k分配2个字节(VC下分配4个字节)的内存单元 char ch[10]; //系统将给这个数组ch分配10个字节的内存块,首地址就是ch
4 指针与字符串
1、字符串表示 用字符数组名实现
例: void main ( ) { char string[] = “I love China!”; printf (“%s\n”, string); printf (“%s\n”, string + 7); } 运行结果: I love China! China!
字符指针初始化:把字符串首地址赋给string char *string; string = “I love China!”;
字符指针数组与字符二维数组
char str[3][10] = {"Wuhan", "Beijing", "Shanghai"}; char *pstr[3]; pstr[0] = str[0]; pstr[1] = str[1]; pstr[2] = str[2];
2、二维数组和指针 1. 二维数组的理解: int a[3][4]; a
2000 a[0] a[0]+1 *(a+0)+1 2000 2002 a[0][0] a[0][1] a[0][2] a[0][3] a[1] a[1]+1 *(a+1)+1 2008 2010 *(a[0]+1) *(*(a+0)+1)
指针数组
定义
性质
数组指针
int (*p)[20];
int
*p[20];
p是数组名,是指针常量,不可 p是指针变量,不是数 对p赋值 组名,可对p赋值
7 【例】利用指针数组对键盘输入的5个整数进行从小到大排序。
#include <stdio.h> void main ( ) { int i, j, t; int a, b, c, d, e; //将a,b,c,d,e的内存地址分别赋给p[0]...p[4] int *p[5] = {&a, &b, &c, &d, &e}; //对a,b,c,d,e赋值 scanf ("%d,%d,%d,%d,%d", p[0], p[1], p[2], p[3], p[4]); for (i = 0; i < 4; i++) for (j = i + 1; j < 5; j++) if (*p[i] > *p[j]) //交换p[i]、p[j]所指向的变量值 { t = *p[i]; *p[i] = *p[j]; *p[j] = t; } for (i = 0; i < 5; i++) //显示排序后的结果 printf("%d ", *p[i]); 运行结果(假设输入:3 8 7 6 4): } 3 4 6 7 8
指针P所占 内存单元 a[0]
地址 2000 p a[0] p+1 a[0]+1
2000 a[0][0] 1 a[0] 2002 a[0][1] 2 a[1] 2004 a[0][2] 3 2006 a[1][0] 4 a[1] 2008 a[1][1] 5 2010 a[1][2] 6
p+2 p+3 p+4 p+5
15
静态内存分配一般是在已知道数据量大小的情况下使用 如何解决? 动态内存分配 例如,要对10个学生的成绩按降序输出,则可定义一个数组: int score[10]; 用于存放10个学生的成绩,然后再进行排序。
1
a+1
2008
对于二维数组: (1)a是数组名, 包含三个元素 a[0],a[1],a[2] (2)每个元素a[i] 又是一个一维 数组,包含4个 元素
a[1][0]
a[1][1] a[1][2]
a+2
2016
a[2]
2016
相关文档
最新文档