指针PPT(让你不再害怕指针)

合集下载

第8章 指针及其应用

第8章  指针及其应用

【说明】 ①、直接拿 a 当指针用,a 指向数组的开始元素,a+i 是指向数组的第 i 个元素的指针。 ②、指针变量 pa 是变量,可以变的。但数组 a 是静态的变量名,不可变,只能当做常 量指针使用。例如:p=p+2;是合法的,a=a+2;是非法的。 ③、 最早在使用标准输入 scanf 时就使用了指针技术, 读入一个变量时要加取地址运算 符’&’传递给 scanf 一个指针。对于数组,可以直接用数组名当指针。
4、多重指针
既然指针是指向其他类型的,指针本身也是一种类型。 C++允许递归地指针指向指针的指针——多重指针。 【例 4】双重指针运用举例。 #include<cstdio> using namespace std; int a=10; int *p; int **pp; //定义双重指针 int main() { p=&a; //将 p 指向 a pp=&p; //将 pp 指向 p printf("%d=%d=%d\n",a,*p,**pp); //**pp 通过 2 次间接访问了 a 的变量的值 10 return 0; } 输出: 10=10=10 【说明】 多重指针除了可以多次“间接”访问数据,OI 上主要的应用是动态的多维数组,这个 强大的功能将在后面专门介绍。
第八章
指针及其应用
指针是 C++语言中广泛使用的一种数据类型,运用指针编程是 C++语言最主要风格之 一。利用指针变量可以表示各种数据结构,能很方便地使用数组和字符串,并能像汇编语言 一样处理内存地址,从而编出精炼而高效的程序,指针极大地丰富了 C++语言的功能。学习 指针是学习 C++语言最重要的一环,能否正确理解和使用指针是我们是否掌握 C++语言的一 个标志。 同时, 指针也是 C++语言中最为困难的一部分, 在学习中除了要正确理解基本概念, 还必须要多编程、多上机调试,只要做到这些,指针也是不难掌握的。

全的C语言指针详解PPT课件

全的C语言指针详解PPT课件

在函数中使用指针参数
03
使用指针参数来访问和修改指针所指向的内容,需要使用“-
>”或“*”运算符。
05
指针的高级应用
指向指针的指针(二级指针)
定义与声明
二级指针是用来存储另一个指 针的地址的指针。在声明时, 需要使用`*`操作符来声明二级
指针。
初始化与使用
通过使用`&`操作符获取一个指 针的地址,并将该地址存储在 二级指针中。然后,可以通过 二级指针来访问和操作原始指
当使用malloc或calloc等函 数动态分配内存后,如果 不再需要该内存,必须使 用free函数释放它。否则, 指针将指向一个无效的内 存地址。
当一个指针在函数中定义 ,但该函数返回后仍然存 在并继续指向无效的内存 地址时,就会产生野指针 。
避免指针越界访问
总结词:指针越界访问是指试图访问数 组之外的内存,这是不安全的,可能会 导致程序崩溃或产生不可预测的结果。
指针与内存分配
通过指针来访问和操作动态分配的内存空间。指针可以 存储动态分配的内存地址,并用于读取和写入该地址中 的数据。
指向结构体的指针
01
定义与声明
指向结构体的指针是指向结构体类型的指针。在声明时,需要使用结
构体类型的名称来声明指向结构体的指针。
02 03
初始化与使用
通过使用`&`操作符获取结构体的地址,并将该地址存储在指向结构 体的指针中。然后,可以通过该指针来访问和操作结构体中的成员变 量。
```
பைடு நூலகம்
指向数组元素的指针
• 指向数组元素的指针是指向数组中某个具体元素的指针。通过将指针指向数组中的某个元素,可以访问该 元素的值。
• 指向数组元素的指针可以通过定义一个指向具体元素的指针来实现。例如,定义一个指向数组中第三个元 素的指针,可以使用以下代码

软件技术基础之指针和结构体课件ppt课件

软件技术基础之指针和结构体课件ppt课件


从右图可知,指 针变量和一般变量一 指针变量pi 变量地址(指针)
量 地 址
样,仅仅是变量旳内




容为变量地址旳变量
变量i
变量值

而已。这里变量和指针变量旳类型必须一致。
针 变

一般而言,指针变量只能存储某一种数据类型旳 变量旳地址,由此可将指针变量分为:整型指针变量、 实型指针变量和字符型指针变量等等,指针变量旳类 型表白了其指向旳存储单元中存储旳数据旳类型。
另一种引用旳形式: 构 造指针变量名 组员名 定义:struct data * today; today 为指向该构造旳指针
可见,“”和“·”操作符分别使用在用指向构造旳 指针和用构造变量来访问构造中旳数据项(组员)时。
例:构造例程。
结 构 体小结
构造体是C语言中旳一种复杂(构造)类型,它是一种 被命名为一种标识符旳多种变量旳集合。构造旳定义拟定了 构造变量或构造指针旳格式,构造是软件设计中实现数据抽 象旳基础。
3、程序中一旦定义了一种变量,该变量在内存中就将 占用一定旳存储单元。变量占用旳存储单元总是n(n>0) 个连续旳字节,开始字节旳地址,就是变量旳地址也可 称为该存储单元旳首地址。
二、指针旳基本概念:
指针就是变量旳地址。与此相应,在C语言中使
用一类专门旳变量即指针变量来存储变量旳地址。
所以,指针变量是存储地址数据旳变量。
四、指针旳“&”、“*”和赋值运算:
1 、& 取地址运算和 * 引用运算 取地址运算符&旳作用是取变量旳地址。如:
& i 表达求变量 i 旳地址。 引用运算符 * 旳作用是取指针指向变量旳内容。

第五章3指针(11--33)

第五章3指针(11--33)

第五章3指针(11--33)⼗⼀指针的运算1、作为⼀种特殊的变量,指针可以进⾏⼀些运算,但并⾮所有的运算都是合法的,指针的运算主要局限在加减算术和其他⼀些为数不多的特殊运算。

2、把a的值5作为地址 0x00000005赋值给*p是发⽣访问冲突。

整数与指针最好不要直接运算。

3、地址的赋值和指针的赋值。

num,p1,p2 他们中⼀个改变,其他的两个都会跟着改变4、 a被编译器解析为数组的⾸地址通过下标循环进⾏遍历通过指针循环进⾏遍历5、通过dll注⼊的⽅式修改另⼀个进程的数据通过定义并初始化⼆级指针p,使其改变另⼀个程序的指针p的指向,从⽽改变它的值。

外挂⼯具:cheat engine注意不会实时刷新⼗⼆指针的算数运算1、使⽤递增/递减运算符(++ 和 --)将指针递增或递减指针++就是按照指针类型的⼤⼩,前进⼀个类型的⼤⼩,int,前进四个字节指针 ++ 和 -- 只有在数组的内部才有意义。

2、指针++ 就是指针每次向前移动sizeof(指针类型)个字节通过指针循环的⽅式初始化数组a的每⼀个元素(从头到尾扫描数组)(注:格式控制符“%p”中的p是pointer(指针)的缩写。

指针的值是语⾔实现(编译程序)相关的,但⼏乎所有实现中,指针的值都是⼀个表⽰地址空间中某个存储器单元的整数。

printf函数族中对于%p⼀般以⼗六进制整数⽅式输出指针的值,附加前缀0x。

)3、指针加上2,在数组内部等价于向后移动两个元素的⼤⼩指针减去3,等价于数组内部,向前移动3个元素的⼤⼩此时此刻,就会打印出 3 5 24、指针的加减法在⾮数组内部没有任何意义,⽽且很容易越界报错⼀个exe不能读写其他exe进程的内存。

⼗三指针之间的⽐较1、对两个毫⽆关联的指针⽐较⼤⼩是没有意义的,因为指针只代表了“位置”这么⼀个信息,但是,如果两个指针所指向的元素位于同⼀个数组(或同⼀块动态申请的内存中),指针的⼤⼩⽐较反映了元素在数组中的先后关系。

指 针

指  针

2. 一维数组元素的地址表示法
由于数组名(设为a)为数组的首地址常量, 用它组成的地址表达式可以表示所有元素的地址, 用这些地址(指针)的指向操作表达式即可表示所 有元素: 元素的地址 元素 a≡&a[0] *a≡a[0] a+1≡&a[1] *(a+1)≡a[1] … … a+i≡&a[i] *(a+i)≡a[i] … … 在表示元素的两种方法中,a[i]为下标法,*(a+i) 为地址法
(3) 通过标准函数获得地址值 (4) 给指针变量赋“空”值,如:p=NULL ;
8.1.3 指针的运算及引用
2.指向运算和指针变量的引用 (1) 指向运算符* *运算符作用在指针(地址)上,代表该指针所指向的存储 单元(及其值),实现间接访问,因此又叫“间接访问运算 符”。如: int a=5, *p; p=&a;printf("%d",*p); *P的值为5,与a等价。*运算符为单目运算符,与其他的单 目运算符具有相同的优先级和结合性(右结合性)。根据*运 算符的作用,*运算符和取地址运算符 & 互逆: *(&a)==a &(*p)==p (2) 指针变量的引用 知道了指针变量的作用以及相关的运算符以后,我们就可 以引用指针变量了
8.1.4 指针作为函数参数
被调函数中的形参:指针变量 主调函数中的实参:地址表达式,一般为变 量的地址或取得变量地址的指针变量 例8-3同例8-2,要求用函数调用交换变量的值。
swap(int *p1, int *p2) { int t; t=*p1; *p1=*p2; *p2=t; } main() { int i1, i2; printf("Enter two numbers:\n"); scanf("%d%d", &i1, &i2); if(i1<i2) swap(&i1, &i2); printf("i1=%d,i2=%d\n",i1, i2); }

《地址和指针》PPT课件

《地址和指针》PPT课件

p 2000 2050
q 1010 2000
a5 1010

7.2.2 指针变量的基类型的作用
在C语言中,不同的数据类型变量系统为它们开辟的存储空 间的字节数是不同的。int类型的数据存储空间是2个字节, float类型的数据存储空间是4个字节, char类型的数据存储 空间是1个字节。
系统表示每一个存储空间的地址时,是取该存储空间的第1 个字节的地址作为该变量存储空间的地址。根据指针变量p 中存放的“地址”,只能寻找到变量a第1个字节的存储空间, 它并不是变量a的原值,因为变量a原值是通过2个字节来 数据。
第七章 地址和指针
主要内容 地址和指针的概念 指针变量的定义 给指针变量赋值 对指针变量的操作 指针在函数方面的应用
7.1 地址和指针的概念
7.1.1地址和指针的概念 1.“地址”的概念
在计算机里每一个存储数据的存储单元也都必须 具有一个唯一的“地址”,以示区别不同存储单 元的位置。
NULL是在stdio.h头文件中定义的预定义符,因此使用NULL时,应该在程 序的前面应加上预定义命令行:#include “stdio.h”
7.4 对指针变量的操作
7.4.1通过指针或地址引用一个存储单元 当指针变量中存放了一个确切的地址值时,通过指针可以用
“间接运算符”(*)来引用该地址所代表的存储单元。 1.在赋值号右边由“*”运算符和指针变量组成的表达式,代表
指针所指存储单元的内容。 例如:int *p,i=10,j;
p=&i;
j=*p; 2.在赋值号左边由“*”和指针变量组成的表达式,代表指针
所指的存储单元。 例如:int *p,k=0;
p=&k; *p=150; 整数150存入变量k中。

C语言指针讲解ppt课件

C语言指针讲解ppt课件
scanf(″%d,%d″,&a,&b); p1=&a;p2=&b; if(a<b) {p=p1;p1=p2;p2=p;} printf(″a=%d,b=%d\n\n″,a,b); printf(″max=%d,min=%d\n″,*p1,*p2); }
运行情况如下: 5,9↙ a=5,b=9 max=9,min=5 当输入a=5,b=9时,由于a<b, 将p1和p2交换。交换前的情况见图 (a),交换后见图(b)。
地址。
10.2.2 怎样引用指针变量
在引用指针变量时,可能有三种情况: ⑴给指针变量赋值。如:
p=&a; ⑵引用指针变量的值。如:
printf(“%o”,p); ⑶引用指针变量指向的变量。
有关的两个运算符: (1) & 取地址运算符。 &a是变量a的地址。 (2) * 指针运算符 (或称“间接访问”运算符),*p
1 2 3 4 5 6 7 10 9 0↙
1 2 3 4 5 6 7 10 9 0
10.3.4 用数组名作函数参数
在第7章中介绍过可以用数组名作函数的参数。 如: void main()
{if(int arr[],int n); int array[10]; ┇ f(array,10); ┇ } void f(int arr[ ],int n)
{ ┇
}
例10.7 将数组a中n个整数按相反顺序存放
#include <stdio.h> void main() { void inv(int x[ ],int n);
int i,a[10]={3,7,9,11,0, 6,7,5,4,2};
printf(″The original array:\n″); for(i=0;i<10;i++) printf (″%d,″,a[i]); printf(″\n″); inv (a,10); printf(″The array has been in verted:\n″); for(i=0;i<10;i++) printf (″%d,″,a[i]); printf (″\n″); }

《C语言》指针--ppt课件全文

《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
指向函数的指针变量

指针ppt课件

指针ppt课件

可以通过将数组名赋值给指针变量来 初始化数组指针,例如 int *p = arr; 其中 arr 是数组名。
指向数组的指针
指向数组的指针的概念
指向数组的指针是指向整个数组的指针,可以通过将数组 名赋值给指针变量来获取整个数组的首地址。
指向数组的指针的初始化
可以通过将整个数组名赋值给指针变量来初始化指向数组 的指针,例如 int (*p)[5] = &arr; 其中 arr 是包含 5 个整 数的数组。
指针乘法和除法
指针的乘法和除法运算在实际编程中很少使用,因为它们的意义不太 明确。
指针的关系运算
01
关系运算符
包括大于(>)、小于(<)、大于等于(>=)、小于等于(<=)等
。这些运算符可以用于比较两个指针所指向的内存地址的大小关系。
02
大于和小于运算
比较两个指针所指向的内存地址的大小,如果第一个地址大于第二个地
06 指针的高级应用
动态内存分配
动态内存分配的概念
动态内存分配是指在程序运行时,根据需要动态地分配或释放内 存空间的过程。
动态内存分配的方法
常见的动态内存分配方法有malloc、calloc、realloc和free等函数 。
动态内存分配的注意事项
在动态内存分配时,需要注意内存对齐、内存碎片化、内存泄漏等 问题,以确保程序的正确性和稳定性。
二叉树操作
二叉树的概念
二叉树是一种树形数据结构,每个节点最多有两个子节点,通常称为左子节点和右子节点 。
二叉树的创建与遍历
二叉树的创建需要为每个节点分配内存,并设置左子节点和右子节点的指针;二叉树的遍 历包括前序遍历、中序遍历和后序遍历等,需要遵循二叉树的结构和特性进行操作。

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

大学C语言实用教程(课件)-第6章-指针

大学C语言实用教程(课件)-第6章-指针

int *p=&a;
// p指向a
printf("a=%p b=%p c=%p p=%p\n",&a,&b,&c,&p); printf("p=%p *p=%d\n",p,*p);
p--;
}
// p指向a前面的存储单元
printf("p=%p *p=%d\n",p,*p);
2. 指针与整数相加减 指针加减一个整数n可以使指针移动,可以访问新地址。
char c= 'A',*pc=&c; float a=3.0,*pa=&a;
指针变量指向变量示意图
pa FF74 FF70 FF71 FF72 FF73 FF74 a 3.0 FF75 FF76 FF77 FF78 pc FF7C FF79 FF7A FF7B c A FF7C
② 赋值方法 先定义指针,然后用赋值语句将所指变量的地址赋给它。例如 char c,*pc;
4. 两个同类型指针相减
x[0]
如果两个同类型指针之间所存储的数据的 x[2] 类型也与指针相同(通常是数组的情况),则相 减的结果是这两个指针之间所包含的数据个数。 x[3]
x[4]
x[1]
【例】两个同类型指针相减。 #include <stdio.h> void main() { float x[10]; float *p,*q; p=&x[2]; q=&x[8]; printf("q-p=%d\n",q-p); }
6.1.2 指针和指针变量
1.指针和指针变量的概念
变量的指针:该变量在内存中的地址。 指针变量:专门用来存放变量地址的特殊变量。 在不致引起混淆的情况下,把指针变量简称为指针。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

• 首先从 P 处开始,先与[]结合(因为其优先级 比*高),所以 P 是一个数组
• 然后再与*结合,说明数组里的元素是指针 类型
• 然后再与 int 结合,说明指针所指向的内容 的类型是整型的
• 所以P 是一个由返回整型数据的指针所组成 的数组
2020/4/22
int (*p)[3];
<---描述一下变量p
2020/4/22
4 指针本身所占据的内存区
• 指针也是一个变量,指针也有自己所占据 的内存段,而这个内存段的长度是固定的,
可以用sizeof(指针的类型)测量一下,正如
前面所言,一台32位的机器,指针变量本 身占据的4个字节的长度。 • 指针本身占据的内存这个概念在判断一个 指针表达式(后面会解释)是否是左值 (可以被赋值的值)时很有用。
2020/4/22
指针与数据结构
• 指针的灵活,使得指针有着强大的功能, 因为指针是对动态内存操作的唯一手段, 所以指针不仅仅可以配合数组操作,还成 为一些高级数据结构的链接方式,比如链 表,树,图等。这些以后会涉及。
2020/4/22
指针与函数
• 总的来说,指针就是一种数据类型,一种 普通数据类型,它和别的数据类型一样, 可以成为函数的参数,可以成为函数的返 回值,用法和其他数据类型一样,不再讨 论。
• 然后再与*结合,说明指针所指向的元素是 指针
• 然后再与 int 结合,说明该指针所指向的元 素是整型数据
注意:由于二级指针以及更高级的指针极少用在复杂的类型中,所以后面更 复杂的类型我们就不考虑多级指针了,最多只考虑一级指针.
2020/4/22
int p(int); <---描述一下p
• 从 P 处起,先与()结合,说明 P 是一个函数 • 然后进入()里分析,说明该函数有一个整型
让你不再害怕指By针`Hypo
目录
什么是指针 指针的操作 使用注意事项
一种普通的数据类型
一种存储地址的容器
什么是指针
一种访问内存的方法
一种内存段的表示手段
指针是一种普通的数据类型
• 指针和int,double一样,是C语言的重要组成 部分,是一种常见的数据类型。
• 指针类型和普通的数据类型一样,是内存 中的一段内存空间,有自身的地址,内存 空间储存着值。
• 指针的不同在于int的内存空间存储了一个 整数,double的内存空间存储了一个小数, 而指针的内存空间存储了一个地址。
2020/4/22
什么是地址
• 所有的变(常)量都是内存条中的一段01, 当我们使用这个量的时候,就是获取、使 用这段01。因此当我们想要访问这段内存, 就需要一个内存地址。这和我们想要拜访 一个人,需要知道他的门牌号一样。
• 首先从 P 处开始,先与*结合,说明 P 是一个 指针
• 然后再与[]结合(括号了改变优先级),说 明指针所指向的内容是一个数组
• 然后再与 int 结合,说明数组里的元素是整 型的
• 所以 P 是一个指向由整型数据组成的数组 的指针
2020/4/22
int **p;
<---描述一下变量p
• 首先从 P 开始,先与*结合,说是 P 是一个指 针
2020/4/22
指针是一种存储地址的容器
• 指针是一种数据类型,我们可以特定数量 类型的变量称之为容器,比如int型变量是 一个存放整数的容器,double型变量是一个 存放小数的容器,而指针就是存放地址的 容器。
• 也正是因为指针可以存放地址,可以使用 地址,才成就了指针的特殊地位。
• 比如,指针让我们多了一种访问内存的方 式。
变量的参数 • 然后再与外面的 int 结合,说明函数的返回
值是一个整型数据
2020/4/22
int (*p)(int); <---描述一下p
• 从 P 处开始,先与指针结合,说明 P 是一个指 针
• 然后与()结合,说明指针指向的是一个函数 • 然后再与()里的int 结合,说明函数有一个
int 型的参数 • 再与最外层的int 结合,说明函数的返回类
编译器认为你 对指针所有的 操作都是正确 的,尽管你都 不认为是正确 的。
不仅仅是指针, 多用是快速掌 握的最佳手段, 尽管你会遇到 各种手残。但 请相信自己!
树、图 链表 指针
Thanks 愿编译器保佑你
• 所以 P 是一个返回整型数据的指针
2020/4/22
int p[3]; <---描述一下p
• 首先从 P 处开始,先与[]结合,说明 P 是一个 数组
• 然后与 int 结合,说明数组里的元素是整型 的
• 所以 P 是一个由整型数据组成的数组
2020/4/22
int *p[3];
<---描述一下变量p
• 指针的类型是描述一个指针的重要属性 • 从语法的角度看,只要把指针声明语句里
的指针名字去掉,剩下的部分就是这个指 针的类型。这是指针本身所具有的类型。
2020/4/22
2.指针所指向的类型
• 指针指向的类型名描述了这个指针内存放 了什么数据类型变量的地址。
• 当通过指针来访问指针所指向的内存区时, 指针所指向的类型决定了编译器将把那片 内存区里的内容当做什么来看待。
2020/4/22
注意
• 指针所指向的内存区和指针所指向的类型 是两个完全不同的概念。如在(int * p;)中, 指针所指向的类型(int)已经有了,但由 于指针还未初始化(p存储的值还是随机 的),所以它所指向的内存区是不存在的, 或者说是无意义的。
• 以后,每遇到一个指针,都应该问问:这 个指针的类型是什么?指针指的类型是什 么?该指针指向了哪里?
2020/4/22
指针的算数运算
指针与普通变量
指针的操作
指针与数据结构
指针与函数
要了解指针的操作,需要先认识一些比较 复杂的类型,所以将先介绍一下如何完全 理解一个复杂类型。要理解复杂类型其实 很简单,一个类型里会出现很多运算符, 他们也像普通的表达式一样,有优先级, 其优先级和运算优先级一样,所以总结了 一下其原则:
从变量名处起,根据运算符优先级结合,一步一 步分析。
2020/4/22
int p;
<---描述一下变量p
• 这是一个普通的整型变量
2020/4/22
int *p;
<---描述一下变量p
• 首先从 P 处开始,先与*结合,所以说明 P 是 一个指针
• 然后再与 int 结合,说明指针所指向的内容 的类型为 int 型
2020/4/22
指针的算术运算
• 指针可以加上或减去一个整数。指针的这 种运算的意义和通常的数值的加减运算的 意义是不一样的,以单元为单位。
• 而这个单元就是sizeof(指针指向的数据类型) • 也就说,一个指针加n或者减n,就是这个
指针指向的地址加上n个单元或者减去n个 单元 • 这些操作主要用在指针与数组的结合上
型是整型 • 所以 P 是一个指向有一个整型参数且返回
类型为整型的函数的指针
2020/4/22
int *(*p(int))[3]; <---描述一下变量p
• 从 P 开始,先与()结合,说明 P 是一个函数 • 然后进入()里面,与 int 结合,说明函数有一个整型变量参
数 • 然后再与外面的*结合,说明函数返回的是一个指针 • 然后到最外面一层,先与[]结合,说明返回的指针指向的
2020/4/22
指针的算术运算
• 因为指针存储的是一个值(门牌号),那 么两个指针是可以向加减的,其相减的数 便是两个地址间的长度(但必须类型相 同),一般用在数组方面(可以计算中间 有几个元素)。而相加是没有意义的,所 以也不要尝试把两个指针相加,这是非法 操作。
2020/4/22
指针的运算符&和*
• &是取地址运算符,*是间接运算符。 • &a 的运算结果是一个指针,指针的类型是
a 的类型加个*,指针所指向的类型是 a 的 类型,指针所指向的地址嘛,那就是 a 的地 址。*p 的运算结果就五花八门了。总之*p 的结果是 p 所指向的东西,这个东西有这 些特点:它的类型是 p 指向的类型,它所 占用的地址是 p所指向的地址。
2020/4/22
指针是一种内存段的表示手段
• 仅是从内存访问还看不出指针的用途。 • 我们可以声明一段内存空间,只用他的首
地址表示,虽然我们只拥有这个指针,可 我们可以多这个内存段“胡作非为”。 • 比如我们可以用int *p = (int*)malloc(sizeof (int) * n); 来声明出一段可以存放n个整数的内存空间, 我们可以使用p指针,对其任意操作。
• 这里只讲如果传递数组,函数形参还可以 这样用int func (int * num),其中num就可以传 递一个整形数组,字符串一样。大家可以 自己试一下。
2020/4/22
指针的灵活带了危险 使用指针明确所用指针四要素
使用注意事项 尽量养成初始化的习惯
活用指针不要滥用指针
了解
认识
手残
多用
变通
• 从语法上看,只须把指针声明语句中的指 针名字和名字左边的指针声明符*去掉,剩 下的就是指型(即指针本身的类型)和指针所指 向的类型是两个概念。一个描述的是指针 这个变量,另一个描述的是这个指针变量 所指向的变量。
• 在指针的算术运算中,指针所指向的类型 有很大的作用。(比如指针在数组中的操 作)
是一个数组 • 然后再与*结合,说明数组里的元素是指针 • 然后再与 int 结合,说明指针指向的内容是整型数据 • 所以 P 是一个参数为一个整数据且返回一个指向由整型指
针变量组成的数组的指针变量的函数
相关文档
最新文档