指针和变量的关系

合集下载

大学C++第5章指针的应用

大学C++第5章指针的应用
例如: int *p; p=0; ②另外,也不能把常量或表达式的地 址赋给指针变量。 例如:
00:22
前一页 休息
int *p, i=0; p=&67; p=&(i+5);
10
③指针变量是有类型的,所以给指针变 量赋的值不但要是一个地址,而且应该是 一个与该指针变量类型相符的变量的地址。 例如:float f=34.5, *fptr=&f;
C
二、指针变量的关系运算
表示所指变量在内存中的位置关系。 例如:两个指针变量p1、p2指向同一数
组中的元素时:
若p1==p2:表示p1和p2指向数组中 的同一个元素;
若p1<p2:表示p1所指的数组元素在p2所 指的数组元素之前; 若p1>p2:表示p1所指的数组元素在p2所 指的数组元素之后。
变量的数据类型。 例如:int *p;
00:22
前一页 休息 7
3. 在指针定义中,一个“*”只能表示 一个指针变量。
例如:int *p1,p2;
4. 允许声明void类型的指针变量,可以 存储任何类型变量的地址。 例如: void *general; int *point, i; general=&i; point=(int *)general;
x<=*(t+p)停止,此时p即为插入点位置。
重复比较是一个循环操作,循环条件为 x>*(t+p),为了保证位置操作只在数组中进 行,增加一个位置限制p<N。
确定插入位置的程序代码为:
p=0;
t=a;
while (x>*(t+p)&&p<N)
p++;

《c++程序设计》第7章 指针

《c++程序设计》第7章 指针
2.指针变量的赋值
(1)取地址运算符&: 取出变量的内存首地址
(2)指针变量的赋值: 指针变量=&变量;或指针变量=指针变量;
3.指针变量的引用
指针运算符* :通过指针变量间接访问变量对应存储单元内容。
【例7.1】定义指针变量
p、p1、q,并将变量a的 地址赋给p、p1,输出a、 p、p1、*p、*p1的值。
【例7.3】指针变量的自加、自减、加n和减n运算。例程
3.指针变量的关系运算
指针变量的关系运算是指针变量值的大小比较,即 对两个指针变量内的地址进行比较,主要用于对数组元 素的判断。
【例7.4】用指针变量求一维实型数组元素和,并输出数组每个元 素的值及数组和。 例程
4.指针运算符的混合运算与优先级
指针数组
例如,指针数组的定义: int *pi[4];
表示定义了由4个整型指针元素pi[0]、pi[1]、pi[2]、pi[3]组成的整型指针数组。 char *pc[4];
表示定义了由4个字符型指针元素pc[0]、pc[1]、pc[2]、pc[3]组成的字符型指针数组。 (3)指针数组元素的引用 【例7.15】用指针数组输出字符串
3.数组元素的引用
对一维数组a[ ]而言,当p=a时: ①第i个元素地址:&a[i]= p+i=a+i。 ②第i个元素值:a[i]= *(p+i) =*(a+i)=p[i]。
一维数组的第i个元素有四种方式引用: a[i]、*(p+i) 、*(a+i)、p[i]。
用数组指针的四种方法求一维数组中的最大值的方法为: 方法一:使用*(a+i)访问a[i] 方法一:用指针变量名p代替数组名a,即用 p[i]代替a[i] 方法二:移动指针变量p++,用*p访问a[i] 方法三:使用*(p+i)访问第 i个元素a[i]

指针变量的定义与引用

指针变量的定义与引用

指针变量的初始化
在定义指针变量时同时给该变量一个初始值, 在定义指针变量时同时给该变量一个初始值,称为 指针变量初始化。 指针变量初始化。 例如: 例如: int a=20; int *pa; pa=&a;(&为取地址符) ( 为取地址符 为取地址符)
指针变量的几点说明
(1)指针变量名前的“*”表示该变量为指针变量,而指针 )指针变量名前的“ ”表示该变量为指针变量, 变量名不包含该“ ” 变量名不包含该“*”。 (2)一个指针变量只能指向同一类型的变量。 )一个指针变量只能指向同一类型的变量。 (3)指针变量中只能存放地址,而不能将数值型数据赋给 )指针变量中只能存放地址, 指针变量。 指针变量。 (4)只有当指针变量中具有确定地址后才能被引用。 )只有当指针变量中具有确定地址后才能被引用。
指针变量的引用
对指针变量的引用包含两个方面: 对指针变量的引用包含两个方面:一是对指针变量 本身的引用,如对指针变量进行各种运算; 本身的引用,如对指针变量进行各种运算;二是利用指 针变量来访问所指向的目标,对指针的间接引用。 针变量来访问所指向的目标,对指针的间接引用。 与指针相关的两个运算符: 与指针相关的两个运算符: (1)&:取地址运算符 ) 取地址运算符 (2)*:指针运算符,取其指向的内容 ) :指针运算符, 指针指向的对象可以表示成如下形式: *指针变量 指针指向的对象可以表示成如下形式: *指针变量 特别要注意的是,此处*是访问指针所指向变量的运算 特别要注意的是,此处 是访问指针所指向变量的运算 与指针定义时的*不同 在定义指针变量时, 不同。 符,与指针定义时的 不同。在定义指针变量时,* 号表 示其后是指针变量。在其它位置出现, 号是运算符。 示其后是指针变量。在其它位置出现,* 号是运算符。 如果与其联系的操作数是指针类型, 是间接访问 引用) 是间接访问(引用 如果与其联系的操作数是指针类型,*是间接访问 引用 运算符;如果与其联系的操作数是基本类型, 运算符;如果与其联系的操作数是基本类型, *是乘法运算符。在使用和阅读程序时要严格 是乘法运算符。 是乘法运算符 区分* 号的含义。 区分 号的含义。

《C语言程序设计》第8章指针

《C语言程序设计》第8章指针
}
10.3.3 指针变量和数组作函数参数 数组名作形参时,接收实参数组的起始地址;
作实参时,将数组的起始地址传递给形参数组。
引入指向数组的指针变量后,数组及指向数 组的指针变量作函数参数时,可有4种等价形式 (本质上是一种,即指针数据作函数参数):
(1)形参、实参都用数组名 (2)形参、实参都用指针变量 (3)形参用指针变量、实参用数组名 (4)形参用数组名、实参用指针变量
(4)指针变量的++、--与&、*的结合
对于指针变量的++、--与&、*的结合 使用,关键要注意按照运算符的优先级和 结合性进行。
例如: int a=2, *p; p=&a;
•表达式:(*p)++,按运算符的优先级,等价于 a++。其含义为:取出指针变量p所指向的内存单 元的值(即a的值),a的值加1,送回a的内存单 元,a的值变为3,p的值未发生变化,仍然指向 变量a。
程序说明:printf("%s\n",s);语句 通过指向字符串的指针变量s,整体引
用它所指向的字符串的原理:系统首先输出s 指向的第一个字符,然后使s自动加1,使 之指向下一个字符;重复上述过程,直至遇到 字符串结束标志。
main() { char string[ ]=”I love Beijing.”; printf(“%s\n”,string); }
3.数组元素的引用 数组元素的引用,既可用下标法,也可用
指针法。
10.3.2 通过指针引用数组元素 如果有“int a [10],*p=a;” ,则: (1)p+i和a+i都是数组元素a [i]的地址。
(2)*(p+i)和*(a+i)就是数组元素a [i]。 int a [3]; a [0]——*a a [1]——*(a +1) a [2]——*(a +2)

第7章 结构体和联合体数据类型

第7章  结构体和联合体数据类型

结构体数组

结构体数组元素的使用




通过操作数组的每一个元素达到操作数组的目的。结构体 数组元素需要用下标变量的形式表示。 结构体数组元素就相当于一个结构体变量,将引用数组元 素的方法和引用结构体变量的方法结合起来就形成了引用 结构体数组元素成员分量的方法,其一般形式为: 数组名[下标].成员名 不能将结构体数组元素作为一个整体直接进行输入输出, 也需要通过输入输出数组元素的每一个成员分量达到输入 输出结构体数组元素的目的。 可以将结构体数组元素作为一个整体赋给同类型数组的另 外一个元素,或赋给一个同类型的结构体变量。
Ex0707 结构体数组操作(数组元素引用、数组元素的输入输出)示例。
结构体数组

结构体数组作函数的参数



在函数调用期间实参结构体数组将它的全部存储区域或者 部分存储区域提供给形参结构体数组共享。 如果需要把整个实参结构体数组传递给被调函数中的形参 结构体数组,可以使用实参结构体数组的名字或者实参结 构体数组第一个元素(0号元素)的地址。 如果需要把实参结构体数组中从某个元素值后的部分传递 给被调函数中的形参结构体数组,则使用实参结构体数组 某个元素的地址。
Ex0704 结构体变量的输入/输出示例。
结构体类型的定义和使用

结构体变量的使用——做函数参数



结构体类型变量和结构体类型变量的成员都可以作为函数 的参数在函数间进行传递,数据的传递仍然是“值传递方 式”。 使用结构体类型变量作为函数参数时,被调函数的形参和 主调函数的实参都是结构体类型的变量,而且属于同一个 结构体类型。 使用结构体类型变量的成员作为函数参数时,其中被调函 数中的形参是普通变量,而主调函数中的实参是结构体类 型变量中的一个成员,并且形参和实参的数据类型应该对 应一致。

指针1

指针1

*pa=&a[0]; *pa=a[0];这两种赋值方法是错误。
因为a是数组首地址是地址常量,不是变量。
陕 西 师 范 大 学 物 理 学 与 信 息 技 术 学 院 版 权 所 有
指针
• 算术运算
指针变量的运算
C程序设计
– 指针与整数的加减运算:p++; p--; p += k; p -= k; -- p; ++ p; • 指针 p 加上或减去 k ,其意义是指针当前指向位置的前方或后方第 k 个数据的地址。 • 这种运算的结果值取决于指针指向的数据类型。 – 指针加一,减一运算 指向下一个或前一个数据。 例如:y=*px++ 相当于 y=*(px++) (*和++优先级相同,自右向左 运算)
通过指针引用数组元素 经过上述定义及赋值后:
– pa pa+1 pa+i *pa *(pa+1) *(pa+i) &a[0], &(a[1]) &(a[i]) a[0] a[1] a[i]. – a[i], *(a+i) , *(pa+i) pa[i]都是等效的。 – 通过pa++,能 ? 但是不能写 a++,为什么?
陕 西 师 范 大 学 物 理 学 与 信 息 技 术 学 院 版 权 所 有
指针
C程序设计
指针变量作为函数参数
• 指针变量也可作为函数参数,其作用就是 通过函数传递,将变量的地址传到另一个 函数中去 • 指针变量函数参数可以实现在被调函数中 操作主调函数中的变量。 • 各式如下:行参是指针变量;实参可以是 变量的地址,或指针变量。

第06章 指针

第06章 指针
…...
17
高 级 语 言 程 序 设 计 与 应 用 教 程
6.3 指针和地址运算
1、指针变量的加、减运算(移动运算) 将指针变量的原值加上n个
它指向的变量所占用的内存 指针可以参与加法和减法运算,但其加、减的含义绝对 单元字节数。 不同于一般数值的加减运算。如果指针p是这样定义的: ptype *p;,并且p当前的值是ADDR,那么:
第 六 章
指 针
学习指针是学习C语言中最重要的一环, 能否正确理解 和使用指针是我们是否掌握C语言的一个标志,可以说不懂 C语言中的指针就不懂什么是C语言。
2
高 级 语 言 程 序 设 计 与 应 用 教 程
本章学习重点
指针的概念 指针变量的定义、初始化和引用 指针的运算 指针与一维数组 指针与二维数组 指针与字符串 指针作为函数的参数
第 六 章
指 针
3
高 级 语 言 程 序 设 计 与 应 用 教 程
6.1 指针与地址
1、内存地址──内存中存储单元的编号 教学楼
存储地址
内存
存储 单元
0 …... 2000 2001
601 501
602 502
50
2002 注意:内存单元的地址与内存单元中的数据是 401 402 两个完全不同的概念。 2003 存储单元有
指针变量p 2000 指针变量q 2000
第 六 章
…...
指 针
12
高 级 语 言 程 序 设 计 与 应 用 教 程
指针变量赋值的几种错误方法: 例 int *p = &a; int a;
变量a的定义在后,对a的引 用超出了a的作用域
第 六 章
注意:一个指针变量只能指向同类型的变量如果给指针赋 例 int a; 值时,=号右边的指针类型与左边的指针类型不同,则需要 int *pi = &a; pc不能指向非字符型变量 进行类型强制转换。 char *pc = &a; int a; 赋值语句中,被赋值的指针 例 int int *pi; a; 变量p的前面不能再加“*” int *p; 说明符 char *pc; *p = &a; pi = &a; //pi指向a 不允许直接把一个数(或任 pc = (char *)pi; //pc也指向了a,即pi和pc的值都是a的地址 例 int *p; 何其他非地址类型的数据) p = 2000; 赋值给指针变量

C语言--指针

C语言--指针

值传递
运行结果:5, 9
27
例 将数从大到小输出 swap(int *p1, int *p2) { int p; p=*p1; *p1=*p2; *p2=p; } main() COPY { int a,b; int *pointer_1,*pointer_2; scanf("%d,%d",&a,&b); pointer_1=&a; pointer_2=&b; if(a<b)swap(pointer_1,pointer_2); printf("\n%d,%d\n",a,b); }
19
初始:
a p
?
3 :
0x2000

执行:*p=a
a
3 : 3
0x2000
p
?
?
20
初始:
a p
?
3 :
0x2000

执行:p=&a
a
3 :
0x2000
p
0X2000
21
指针变量作为函数参数
当指针变量作为函数参数时,传递的是变量的地址。读 以下程序: void testpoint(int *p) { int t; t=*p; t++; } void main() { int a=3,* p; p=&a; printf(“a=%d\n”,a); testpoint(p); printf(“a=%d\n”,a); }
22
t
3 :
0x6000
p
&amp;a
指针算术运算
使用递增/递减运算符(++ 和 --)将指针递增或 内存 递减

c语言5

c语言5

5.1.3 与指针有关的运算
例5-2 分析下列程序的输出结果。
#include <stdio.h> void main( ) { char a[5]="1234"; char *p; p=a; /*指针变量p指向数组的第一个元素a[0]*/ printf("%d\n",*p); /*输出第一个元素的ASCII值*/ p++; /*指针变量p指向数组的第二个元素a[1]*/ printf("%d\n",*p); /*输出第二个元素的ASCII值*/ }
指针是一种数据类型。 指针是指存放数据的 内存地址 。程序中定义的 变量、数组都要分配内存空间,通过这些空间的地 址可以访问存储在其中的数据,也就是引用变量或 数组元素。可以看出,指针提供了访问数据的另一 种方法(通过变量名访问数据是一种)。
5.1.1 指针的概念
“指针”是个地址概念,是指内存储器中存储单元的地 址。变量在内存中使用存储空间的起始地址,称为该变量 的指针,如图所示。
又:一维数组元素的指针法引用 *(x+i) 与 x[i]等价, 所以,二维数组元素的指针引用法形式为: *(*(x+i)+j) 例5-5 使用指针的方法,输出二维数组的元素。 void main() { int x[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; int i,j; for(i=0;i<3;i++) { for(j=0;j<4;j++) printf("%5d",*(*(x+i)+j)); printf("\n"); } }
5.1.3 与指针有关的运算

指针

指针

(main)
9 5 5 9 2000 2002
(swap)
2000 2002 5
...
…...
整型变量a 整型变量b 指针pointer_1 指针pointer_2
指针p1 指针p2
整型p
例 将数从大到小输出
swap(int *p1, int *p2) { int p; 2000 p=*p1; 2002 *p1=*p2; 2004 *p2=p; 2006 } 地址传递 2008 main() 200A { int a,b; int *pointer_1,*pointer_2; 200C scanf("%d,%d",&a,&b); 200E pointer_1=&a; pointer_2=&b; 2010 if(a<b)swap(pointer_1,pointer_2); printf("\n%d,%d\n",a,b); }
#define NULL 0 int *p=NULL:
p=NULL与未对p赋值不同 用途: 避免指针变量的非法引用 在程序中常作为状态比较
例 例 char *p; int *p1; ...... void *p2; while(p!=NULL) p1=(char *)p2; { ...… p2=(void *)p1; } 表示不指定p是指向哪一种 类型数据的指针变量
…...

整型变量i
i=3;-----直接访问
2000 2001 2002 2003 2004 3 20 10
变量i_pointer 2000
2005
2006
指针变量

*i_pointer=20; -----间接访问

第13章Fortran指针

第13章Fortran指针

13.2 指针的基本应用
• 在Fortran语言中,指针能够与之进行联合的变量 既可以是其他非指针变量,也可以是通过动态内 存分配得到的一块内存。
13.2.1 指针的基本用途
• 下面通过一个具体的实例来说明指针变量最基本 的用途,即与其他非指针变量进行联合从而操纵 相应存储空间中的数据。
• (详细内容请参照本书)
• ! 为指针分配存储空间
• ALLOCATE(A, STAT=Err)
• IF(0 /= Err) THEN

PRINT *, ‘分配指针的存储空间失败!’
• STOP
• ENDIF
• A = 3.1415926
• PRINT *, P
• END PROGRAM TEST1303
13.2.4 指针状态的查询和更改
13.4 指针与过程
• 指针也可以作为参数传递进过程中(包括函数子在使用指针作为过程的相关参数 时,需要注意以下一些问题:
• 当使用指针作为参数传递进过程时,在主调过程 中必须对被调函数进行显式的接口说明,即必须 编写INTERFACE接口;
• 在使用一个指针之前,可以通过ASSOCIATED内部函数来查 询指针当前的状态。语句的使用形式如下:
• ASSOCIATED(pointer[, target]) • 该内部函数用于检查指针是否设置了指向,返回值为逻辑
型变量。如果函数只含有一个指针参数,则会检查该指针 是否已经建立联合;如果函数含有两个参数,则会检查第 一个指针参数是否与第二个目标参数联合。 • 除了查询函数,Fortran语言中还提供NULL空置函数来确保 指针指向一个不能使用的内存地址,从而保证ASSOCIATED 能够正确判断出指针还没有与任何目标建立联合。语句的 使用形式如下: • NULL()

8.指针

8.指针

例 p指向int型数,则 p+1 p+12 例 p指向int型数组,且p=&a[0]; 则p+1 指向a[1] 例 int a[10]; int *p=&a[2]; p++; *p=1; 1
p+i
a[3]
a[4] a[5] a[6] a[7] a[8] a[9]
p+9
指针的算术运算: 若指针变量p1与p2都指向同一数组,如执行p2-p1, 结果是两个地址之差除以数组元素的长度。 即 p2-p1(p2-p1)/d 假设p2指向实型数组元素a[5],p2的值为2020;p1指 向a[3] ,其值为2012, 则p2-p1的结果是(2020-2012)/4=2. 这个结果是有意义的,表示p2所指的元素与p1所指的 元素之间差2个元素。 p1+p2 无实际意义
a+9
a[9] *(a+9)
p+9
*(p+9)
下标法 a[i] *(p+i) *(a+i)
指针法
例 输出数组中的全部元素。
假设有一个a数组,整型,有10个元素。要输出 各元素的值有三种方法:
(1)下标法。
(2) 通过数组名计算数组元素地址,找出元素的值。
(3) 用指针变量指向数组元素。
(1)下标法。(8-3(1).c) #include <stdio.h> void main() { int a[10]; int i; for(i=0;i<10;i++) scanf(″%d″,&a[i]); printf(″\n″); for(i=0;i<10;i++) printf(″%d″,a[i]); }
2000 3 a 2002 4 b

C语言实验报告答案

C语言实验报告答案

C语⾔实验报告答案南京信息⼯程⼤学实验(实习)报告实验(实习)名称:指针及其应⽤⽇期:得分:指导⽼师:院系:应⽤⽓象学院专业:班次:姓名:学号:实验⽬的(1)掌握变量的指针及其基本⽤法。

(2)掌握⼀维数组的指针及其基本⽤法。

(3)掌握指针变量作为函数的参数时,参数的传递过程及其⽤法。

⼀.实验内容(1)运⾏以下程序,并从中了解变量的指针和指针变量的概念。

(2)运⾏以下程序,观察&a[0]、&a[i]和p的变化,然后回答以下问题:1.程序的功能是什么?2.在开始进⼊循环体之前,p指向谁?3.循环每增加⼀次,p的值(地址)增加多少?它指向谁?4.退出循环后,p指向谁?5.你是否初步掌握了通过指针变量引⽤数组元素的⽅法?(3)先分析以下程序的运⾏结果,然后上机验证,并通过此例掌握通过指针变量引⽤数组元素的各种⽅法。

(4)编写函数,将n个数按原来的顺序的逆序排列(要求⽤指针实现),然后编写主函数完成:①输⼊10个数;②调⽤此函数进⾏重排;③输出重排后的结果。

⼆.分析与讨论(1)指针的定义⽅法,指针和变量的关系。

定义⽅法:数据类型 *指针变量名;如定义⼀个指向int型变量的指针——int *p;则我们可以继续写如下代码——int a = 4;p = &aprintf("%d", *p);在这⾥,我们定义了⼀个变量a,我们把它理解为内存空间连续的4个字节(int型占⽤4字节),则这4个字节的空间保存着⼀个数4。

&是取地址符号,即把变量a的地址(即这4个字节的⾸地址)赋给指针p (记住指针p的类型和变量a的类型要保持⼀致,否则的话,要进⾏类型转换)。

这样⼦,指针p就保存着变量a的地址。

我们如果把指针p当做内存空间⾥⾯另外⼀个连续的4个字节,那么这4个字节保存的数就是变量a的地址。

printf("%d",*p)和printf("%d",a)的结果是⼀样的。

大学计算机C语言之指针

大学计算机C语言之指针
第10章指针
10.1 地址和指针
JSU
• 变量四个基本要素
名称 地址 内容 类型
X 2002 378
• &X----变量X的地址 • 指针:一种特定的存储单元,单元内存 储的是另一个单元的地址。
江苏大学计算机学院
1
第10章指针
• 访问存储单元(变量)可以通过两种方 式实现:
JSU
– 直接访问----通过名称访问 – 间接访问----通过指针(地址)访问 变量X的地址 &X----变量X的地址(F002)
江苏大学计算机学院
JSU
Main() {int a[5]={2,3,4,5,6},i,*p; for(p=a;a<(p+5);a++) printf(―%d\n‖,*a);} Main() {int a[5]={2,3,4,5,6},i,*p=a; while(p++<(a+5) ) printf(―%d\n‖,*p);}
23
3、数组名作为函数参数(地址传递)
16
10.3 指针与数组
使用指针变量输出
JSU
Main() {int a[5]={5,6,7,8,9},i,*p=a; for(i=0;i<5;i++) printf(― %d‖,*(p+i)); printf(―\n‖);} 问题:将上面的printf(― %d‖,*(p+i))换成 printf(― %d‖,*p++)结果如何?
Void swap(int *x,int *y) {int t; t=*x;*x=*y;*y=t;} Main() {int a=3,b=8; swap(&a,&b); printf(“%d,%d\n”,a,b);}

第08章 变量的间接访问——指针 (《程序设计基础(第3版)(C语言)》(王红梅著 清华大学出版社

第08章 变量的间接访问——指针  (《程序设计基础(第3版)(C语言)》(王红梅著 清华大学出版社

/*指针p指向变量x */
( 第
int *q = p ;
/*指针q指向变量p所指向的变量x*/
版 )


x(*p)
大 学

x(*p)
p
10
版 社
p
10
q
3
Page 14
8.1 指针的概念 指针变量的初始化
3
int x = 10; double *q = &x;
/*指针q的基类型是double,不能指向int型变量*/
大 学

计算机系统和编译器有关。
版 社
(3)定义指针变量时需要明确该指针所指向的数据类型,即该指针所指向的内
存单元可以存放什么类型的数据,对指针变量的运算与它所指向的数据类型密
切相关。
Page 11
8.1 指针的概念
指针变量的初始化
3
例如: int *p ;
int *p = NULL ;
/*NULL为空指针*/
出 版
int *p = NULL, *q = NULL;
/*指针p和q均初始化为空*/

p = &x;
/*指针p指向变量x*/
q = p;
/*指针q指向指针p所指内存单元*/
3
Page 17
8.1 指针的概念
指针变量的操作
1. 指针变量的赋值
通常不允许将一个整数赋给指针变量,由于指针的操作需要编程人员保
指针变量的初始化
3
【语法】初始化指针变量的一般形式如下:
基类型 *指针变量名 = 内存地址 ;
程 序 设



【语

】定

C语言程序设计教程第8章北京邮电大学出版社.

C语言程序设计教程第8章北京邮电大学出版社.

第8章 指针
18
说明: 对于不同基类型的指针,指针变量“加上” 或“减去”一个整数n所移动的字节数(= sizeof( 指针所指对象的数据类型 ) )是不同的。 例如: float a[10], *p=a, *x; x=p+3; /*实际上是p加上3*4个字节赋给x, x依然指向数组的第三个分量*/
C语言程序设计教程
第 8 章 指针
8.1 8.2 8.3 8.4 8.5 8.6 指针与指针变量 指针与函数 指针与数组 指针与字符串 指针数组与命令行参数 程序举例
第8章 指针
2
8.1 指针与指针变量
8.1.1 指针的概念
1.内存与变量地址 内存地址:内存是计算机用于存储数据的存储 器,以一个字节作为存储单元,为了便于访问,给 每个字节单元一个唯一的编号,第一字节单元编号 为0,以后各单元按顺序连续编号,这些单元编号 称为内存单元的地址 。 变量地址:变量所分配存储空间的首字节单元 地址(字节单元编号)。
2018/9/14
C语言程序设计教程
第8章 指针
3
在程序中,对变量的操作实际上是通过地址来完成的。 • 定义时:定义变量→分配内存单元(按类型)→地址 (即内存中的编号) • 存取操作:程序 →变量名 →内存单元 →存取 • 实际上: 程序 →编译 →变量名 →变量的地址
2.访问方式
直接存取:把直接按变量名或地址存取变量值的方式 称为 “直接存取”方式。
2018/9/14
C语言程序设计教程
第8章 指针
10
8.1.3 指针运算
指针运算实际上是地址的计算,包括赋值运算、算术运算、 关系运算三种。
1. 指针的赋值运算 (1)将变量地址值赋给指针变量,使指针指向该变 量。

指针的定义方法,指针和变量的关系

指针的定义方法,指针和变量的关系

指针的定义方法,指针和变量的关系
指针是 C 语言中的一种特殊数据类型,它保存的是一个变量的内存地址,也就是说指针是可以指向其他变量的。

指针的定义方法是在变量名前加一个星号,例如 `int *p` 表示定义了一个指向整型变量的指针变量 p。

指针和变量之间的关系可以理解为指针是指向变量的一个引用,它可以通过指针来操作变量的值。

当我们声明一个指针变量时,它会被分配一个内存地址,这个地址指向的是一个变量的位置。

通过修改指针的值,我们可以改变指针所指向的变量的值。

相反,通过修改变量的值,我们可以影响指针所指向的内存位置。

指针在 C 语言中应用广泛,特别是在动态内存分配、数据结构和函数参数传递方面。

通过指针,我们可以更方便地管理内存、操作数据结构或传递变量的引用而不用拷贝数据。

但需要注意的是,指针也容易引起一些安全问题,例如指针的空指针、野指针、越界指针等等,在使用指针时需要仔细注意。

C语言程序设计(第二版)-电子教案-丁亚涛-8587 第8章 指针

C语言程序设计(第二版)-电子教案-丁亚涛-8587 第8章 指针
}
8.5.3 指针与二维数组
• 二维数组其实可以看成由一维数组构造而成。就相当于 几个队列构成一个方阵,方阵由队列组成,队列由具体 的元素--人组成。
• 一级指针只能管理队列,如果管理方阵,则需要二级指 针。
•int a=1000,*pa,**ppa; • pa=&a; • ppa=&pa;
• *(*(ppa)) ≡ *(pa) ≡ a ≡ 1000
• p是二级指针 • *p相当于*(p+0),级别降低为一级指针,相当于p[0] • **p相当于*(*(p+0)+0),级别降低为数组元素(普通变量),
也相当于p[0][0]
• p[1][2],相当于*(*(p+1)+2) • &p[1][2], 级别提升为一级指针,相当于:
• p[1]+2,*(p+1)+2 • &p[1],级别提升为二级指针,相当于:
f=f4; printf("a/b=%d\n",f(a,b));
8.5 指针与数组
• 8.5.1 指针与字符数组 • char str[100]= "Hello World"; • char *p=str; • 字符w可以有如下多种表示形式: • str[6] • *(str+6) • p[6] • *(p+6)
【例8-2】演示指针和数组的关系。
#include <stdio.h>
接可存取,由于p中存储的是x的信息。访问p可以获取x的信 息,再对银行存款进行操作。
8.1 借钱的故事
8.2 指针的概念
• C语言允许使用变量名、数组名[下标]、函数名等标 识符来访问内存

C语言指针变量

C语言指针变量

C语言指针变量变量的指针就是变量的地址。

存放变量地址的变量是指针变量。

即在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。

因此,一个指针变量的值就是某个变量的地址或称为某变量的指针。

为了表示指针变量和它所指向的变量之间的关系,在程序中用“*”符号表示“指向”,例如,i_pointer代表指针变量,而*i_pointer 是i_pointer所指向的变量。

因此,下面两个语句作用相同:1.i=3;2.*i_pointer=3;第2个语句的含义是将3赋给指针变量i_pointer所指向的变量。

定义一个指针变量对指针变量的定义包括三个内容:1.指针类型说明,即定义变量为一个指针变量;2.指针变量名;3.变量值(指针)所指向的变量的数据类型。

其一般形式为:类型说明符*变量名;其中,*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。

例如:1.int *p1;表示p1是一个指针变量,它的值是某个整型变量的地址。

或者说p1指向一个整型变量。

至于p1究竟指向哪一个整型变量,应由向p1赋予的地址来决定。

再如:1.int *p2; /*p2是指向整型变量的指针变量*/2.float *p3; /*p3是指向浮点变量的指针变量*/3.char *p4; /*p4是指向字符变量的指针变量*/应该注意的是,一个指针变量只能指向同类型的变量,如P3 只能指向浮点变量,不能时而指向一个浮点变量,时而又指向一个字符变量。

指针变量的引用指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。

未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。

指针变量的赋值只能赋予地址,决不能赋予任何其它数据,否则将引起错误。

在C语言中,变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址。

两个有关的运算符:∙&:取地址运算符;∙*:指针运算符(或称“间接访问” 运算符)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(2)建立指针数组和数组指针来引用指向二 维数组
1)指针数组
比如:int *p[3],a[3][2],i;
for(i=0;i<3;i++) 2)数组指针
p[i]=a[i];
比如:int (*ptr)[2],a[3][2];
ptr=a;
ห้องสมุดไป่ตู้
3)应用 用指针数组和一维数组a建 立一个3x2的二维数组,a数组已赋初 值2、4、……。按行顺序输出此二维 数组,然后按列的顺序输出。
指向数组的指针
10.1 指向一维数组的指针 所谓数组的指针是指数组的起始地址 数组元素的指针是数组元素的地址 (1)指向数组元素的指针变量的定义与赋值 比如: int a[10]; int *p; 指针的基类型要与数组元素的类型相同 对指针赋值: p=&a[0]; p 1
3 5 7 9 11 13 15 17 19
int a[2][3]; 则 a数组有两个元素:a[0] a是这两个元素的首地址 a[0] a[1] a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] 则a是指向指针 a[0]是这三个元素的首地址 a[1]
a[1]是这三个元素的首地址
故:a[0]、a[1]是指针常量 常量的指针常量
用指针变量指向数组元素 main( ) { int a[10],*p,i; for(i=0;i<10;i++) scanf(“%d”,a+i); printf(“\n”); for(p=a;p<(a+10);p++) printf(“%d”,*p); }
10.2 指针数组和数组指针
(1)指向一维数组的指针(数组指针) 比如:int (*ptr)[2]; /*定义ptr是指 向两个元素组成的一维数组的指针变量*/ (2)指针数组 比如:int *q[3]; /*定义三个指针变量 组成的数组*/ 10.3 二维数组和指针 (1)二维数组看作一维数组组成的一维数组
a[0]可表示为
则a[0][0]可表示为
*(a+0)
*(*(a+0)+0)
即:a[i][j]可表示为
*(*(a+i)+j)
故二维数组的元素a[i][j]可有以下几种表示 方法: 1) a[i][j] 2)*(a[i]+j) 3)*(*(a+i)+j) 4)(*(a+i))[j] 5)*(&a[0][0]+列数*i+j)
10.4二维数组和指针的应用 (1)求两个矩阵相加(将两个同样大小的 矩阵相同位置上的元素相加) (2)执行下面语句后,表达式
*(p[0]+1)+**(q+2)的值为:
int a[ ]={5,4,3,2,1},
*p[ ]={a+3,a+2,a+1,a},
**p=q;
(3)打印杨辉三角 1 1 1 1 1 2 3 1 3 1
找出其规律:
(1)第0列和对角线上 的元素都为1 (2)除第0列和对角线 上的元素外,其他元 素的值均为前一行上 元素和前一个元素之 1和
6 1
1
1
4
5
6
10
4
10
1
5
1
6
15
20
15
(4)打印一个9x9乘法表(见课本p146
10.4)
数据结构 :a[9][9]
规律:第0行第0列上元素均为其行号或列号 加1,其他任一元素为其所对应行和列上第0 个元素的乘积
2)用指针变量引用数组元素 int a[10],*p; p=a; *(p+0) 即 a[0] *(p+k) 即 a[k] 3)指针带下标 p[k]与a[k]、*(a+k)、*(p+k)等价 都指a数组第k个元素
main( ) { int a[10]; int i; for(i=0;i<10;i++) scanf(“%d”,&a[i]); printf(“\n”); for(i=0;i<10;i++) printf(“%d”,a[i]); }
C语言规定数组名代表数组的首地址,也就 是第一个元素的地址。因此,以下两语句等 价: p=&a[0]; p=a; /*把a数组首地址赋给指针变量p*/ 在定义时可以赋值: int *p=&a[0]; 等价于: int *p; p=&a[0];
(2)通过数组名和指针引用数组元素 1)用数组名(即数组首地址)引用数组元素 *(a+k) 即 a[k] 比如:for(k=0;k<10;k++) printf(“%d”,*(a+k)); a+k就是a[k]的地址,或者说它指向a数 组第k个元素
相关文档
最新文档