指针变量的定义和引用指针变量的定义和引用指针变量的...
C语言:指针变量
![C语言:指针变量](https://img.taocdn.com/s3/m/0c7d438683d049649b665875.png)
C语言:指针变量声明指针变量:基数据类型 * 指针变量名如 int *p ;例:int *p1, *p2;p1和p2是int型指针变量,可以指向int型变量或int数组元素。
char *p3 ; p3是char型指针变量,可以指向char型变量或char数组元素。
指针变量可用来表示它所指向的变量(或数组元素)。
所指向变量的数据类型必须和指针变量的基数据类型相同。
(注:还可声明指向数组、结构、和函数等的指针变量。
)为了让指针变量指向某一变量,须把该变量的地址赋给这个指针变量:指针变量 = &所指向变量如 int k,*p ; p=&k;也可以把一个指针变量如p1的值赋给另一指针变量如p2:p2=p1,只要它们有相同的基数据类型。
此时,p2和p1指向同一变量:指针变量 1 = 指针变量 2 如 int k, *p1,*p2; p1=&k; p2=p1;例:int k, n, a[10], *p1, *p2 ; char c, s[20], *p3, *p4, *p5 ;p1 = &k ; p2 = &a[6] ; p3 = &c ; p4 = &s[0] ; p5 = p4;为引用指针变量所指向的变量,只须在该指针变量前加一星号:*指针变量,如 *p 。
例如, int k,*p; p=&k;接上例:*p1 = 100; /* 同 k=100; */n = *p1 + 5 ; /* 同 n=k+5; */*p4 = ’A’ ; /* 同 s[0]=’A’; */s[1]=*p4; /* 同 s[1]=s[0]; */对指向数组元素的指针变量,可以做整数加减法: 指针变量±整数如p2=p1+1;例如,设p1指向a[i]:p1=&a[i]; 则p1+m指向a[i+m], 即 *(p1+m) 是 a[i+m]。
例: int *p1,*p2, a[10]={0,1,2,3,4,5,6,7,8,9};p1=&a[0]; /* 也可写成p1=&a; 或p1=a; */p2=p1+8; /* p2指向a[8], 同 p2=&a[8] */printf(“%d,%d,%d”, *p1, *p2, *(p1+8) );/* 输出 0,8,8 */注意,数组名本身就代表数组首元素的地址,即:设a[]是数组,则a , &a , 和 &a[0]是一回事,都表示数组首元素的地址。
《c++程序设计》第7章 指针
![《c++程序设计》第7章 指针](https://img.taocdn.com/s3/m/47fb63feed630b1c59eeb5e1.png)
(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]
指针变量的定义和引用(精)
![指针变量的定义和引用(精)](https://img.taocdn.com/s3/m/da9d265da8956bec0975e381.png)
int *p1,*p2; float *q ; 合法标识符 指针变量本身的存储类型 指针的目标变量的数据类型 static char *name; 指针变量与其所指向的变量之间的关系
i_pointer 2000 变量i 3 *i_pointer i &i i=3; *i_pointer i_pointer *i_pointer=3
看出其地址。注意,这个地址并不是始终不变的,这 是由机器和操作系统来安排的,我们无法预先知道。
指针与地址的概念
在现实生活中,我们要给朋友写信,首先通过认识这个人得到 他的地址。但对于投递员来说,他通过投递到这个地址,找到 了这个人。
投递员
弋江区纬六路1号
寄信人
张三
根据C语言知识来说 对于寄信人来说:&张三——弋江区纬六路1号 对于投递员来说:*弋江区纬六路1号——张三 其中:“*”符号为取该地址下的内容
变量的指针和指向变量的指针变量
例3:输入两个整数,按先大后小的顺序输出。 main() { 程序运行中,指针变量p1,p2的指向变化如图 int a,b,*p1,*p2,*p; scanf(“%d%d”,&a,&b); p1=&a;p2=&b; if (a<b) {p=p1;p1=p2;p2=p;} printf(“\na=%d,b=%d\n”,a,b); printf(“max=%d,min=%d\n”,*p1,*p2); } 运行结果为: 输入:5 9 ↙ 输出:a=5,b=9 max=9,min=5
Hale Waihona Puke 指针与地址的概念例1:分析下题的输出结果: main() { int a,b,c; scanf(“%d,%d,%d”,&a,&b,&c); a=10;b=20; c=a+b; printf(“%d,%d”,c,&c,*(&c)); } 用一个变量来代替——指针变量
变量的指针与指针变量.
![变量的指针与指针变量.](https://img.taocdn.com/s3/m/cbdd3cacbceb19e8b8f6ba30.png)
二)指针数组和指向指针的指针
1、指针数组的概念:一个数组中的元素均为指针类型,称为指针数组。
形式:存储类型类型名*数组名[数组长度]
2、指向指针的指针:二级指针的定义:char **p;
含义:表示指针变量p是指向一个字符指针变量(即指向字符型数据的指针变量)的。
三)指针数组作main函数的形参:
指向数组的指针变量
教学难点
指向二维数组的指针
课时安排
2
教学方法
讲授与演示法相结合
教
学
内
容
及
过
程
设
计
一、复习引导
上节课介绍了指针变量的定义及其赋值。一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组和数组元素(把数组起始地址或某一元素的地址放到一个指针变量中)。
二、讲授新课
所谓数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。
引用数组元素可以用下标法(如a[3]),也可以用指针法,即通过指向数组元素的指针找到所需的元素。使用指针法能使目标程序质量高(占内存少,运行速度快)。
一)指向一维数组的指针
定义形式:
int a[10];
int *p;
p=&a[0];或p=a;
第十章指针
课题
第十章变量的指针与指针变量
教学
目的
1、了解指针与地址的概念
2、掌握指针变量的定义、引用及指针变量作为参数
教材
分析
教学重点
指针变量的定义、引用及指针变量作为参数
教学难点
指针变量作为参数
指针变量定义和引用指针变量定义和引用指针变量
![指针变量定义和引用指针变量定义和引用指针变量](https://img.taocdn.com/s3/m/26371b3d02020740be1e9b54.png)
者说这个指针指向整型变量 a,也可以说是指针变量 p 指向整型变量 a 。
系统对变量访问形式分为以下两种:
(1)直接访问
按变量地址存取的变量值的方式称为“直接访问”方式。
说明:用变量名对变量的访问也属于直接访问,因为在编译后,变量名和变量地址之间
有对应关系,对变量名的访问系统自动转换成利用地址对变量的访问。如图 7.4a (2)间接访问 将变量的地址存放在一种特殊变量中,利用这个特殊变量进行访问。如图 7.4b 所示,
7.1 指针的概念
指针就是地址,指针变量是一个特殊的变量,它里面存储的数值被解释成为内存里的一 个地址。指针变量就是存放地址的变量, 要搞清一个指针需要从四个方面的内容来理解: 指针的类型,指针所指向的类型,指针的值或者叫 指针所指向的内存区,还有指针本身所占据的内存 区。
为了便于理解指针的概念,我们有必要讨论一 下计算机内存和数据的关系。我们知道,程序要装 入内存才能够运行,数据也只有装入内存才能被程 序处理,那么程序和数据在内存中的组织形式是怎 样的呢?内存又是什么样的呢?内存是计算机用于 存储数据的存储器,以一个字节作为存储单元,为 了便于访问,给每个字节单元一个唯一的编号,第 一字节单元编号为 0,以后各单元按顺序连续编号,
7.2 指针变量的定义和引用.....................................................................................................3 7.2.1 指针变量的定义和初始化......................................................................................3 1. 指针变量的定义..........................................................................................................3 2. 指针变量的初始化......................................................................................................4 7.2.2 指针变量的引用......................................................................................................4
C语言程序设计 指针变量的定义
![C语言程序设计 指针变量的定义](https://img.taocdn.com/s3/m/3c88eb30caaedd3383c4d364.png)
6.1.3指针变量的定义前面提到的存放地址的变量是一种特殊的变量,它只能用来存放地址而不能用来存放其他类型(例如整型、实型、字符型等)的数据,需专门定义。
“指针”表示指向关系,所谓指针就是地址。
一个变量的指针就是这个变量的地址,存放地址的变量称为指针变量。
例如:pa 是一个指针变量,pa 中存放的是整型变量a 的地址,也就是说pa 指向变量a。
变量a 的地址就是变量a 的指针,一个指针变量的内容一定是另一个变量在内存中的地址。
定义形式为:数据类型说明符*标识符;例如:int*p;表示定义了一个指针变量p,它指向一个整型变量,即p 存放一个整型变量的地址。
说明:(1)“数据类型说明符”是指该指针变量所指向变量的类型;(2)“标识符”就是所定义的指针变量的名字;(3)定义一个指针变量必须用符号“*”,它表明其后的变量是指针变量,但不要认为“*p”是指针变量,指针变量是p 而不是*p;(4)指针可以指向任何类型的对象。
在定义了一个指针变量p 以后,系统为这个指针变量分配一个存储单元(一般为2个字节),用来存放地址。
要使一个指针变量指向某个变量,必须将该变量的地址赋给该指针变量。
例如:int a,b;int*p1,*p2;p1=&a;p2=&b;上述语句表示定义了两个整型变量a,b 和两个指针变量p1,p2,然后将a 的地址赋给p1,b 的地址赋给p2,这样p1指向变量a,p2指向变量b。
6.1.4指针变量的引用定义了一个指针变量后,可以对该指针变量进行各种操作,操作时用到两个有关指针的运算符:(1)&:取地址运算符。
(2)*:指向运算符。
例如:&a 为变量a 的地址,*p 为指针变量p 所指向的变量。
【例6-1】定义指向整型变量的指针/*程序名:6_1.c*/#include <stdio.h>&a&bp1a p2b图6-3指针的指向int main(){int a,b,*p1,*p2;scanf("%d,%d",&a,&b);p1=&a;/*p1指向a*/p2=&b;/*p2指向b*/printf("%d%d\n",*p1,*p2);printf("%d%d\n",a,b);return0;}程序运行如下:3,63636可以看出,printf(“%d,%d\n”,*p1,*p2)和printf(“%d,%d\n”,a,b)两个语句作用相同。
C++指针
![C++指针](https://img.taocdn.com/s3/m/6b25e6d7b9f3f90f76c61b22.png)
(main)
9 5 5 9 2000 2002
(swap)
整型变量a 整型变量b 指针pointer_1 指针pointer_2
2000 2002 5
指针p1 指针p2
整型p
例 将数从大到小输出(用指针作函数的参数)续 void swap(int *p1, int *p2) (main) { int p; 2000 p=*p1; 9 5 2002 *p1=*p2; 5 9 2004 *p2=p; 2000 2006 } 地址值传递 2002 2008 main() 200A { int a,b; int *pointer_1,*pointer_2; 200C a=5; b=9; 200E pointer_1=&a; pointer_2=&b; 2010 if(a<b)swap(pointer_1,pointer_2); cout<<a<<b; } 运行结果:9,5
…...
变量a 变量b 变量x 变量y 变量temp
不能达到预期的结果!
例 将数从大到小输出(用指针作函数的参数) void swap(int *p1, int *p2) { int p; 2000 p=*p1; 2002 *p1=*p2; 2004 *p2=p; 2006 } 2008 main() COPY 200A { int a,b; int *pointer_1,*pointer_2; 200C a=5; b=9; 200E pointer_1=&a; pointer_2=&b; 2010 if(a<b)swap(pointer_1,pointer_2); cout<<a<<b; }
第5章指针和引用
![第5章指针和引用](https://img.taocdn.com/s3/m/b612839c8ad63186bceb19e8b8f67c1cfbd6ee60.png)
cout<<&a[1]<<','<<**(a+1)<<','<<*(a+1)[0]<<endl;
cout<<a[1][1]<<','<<*(*(a+1)+1)<<','<<*(a[1]+1)<<endl;
}
先阅读上述程序,再上机运行该程序,结合机器输出结
果理解。
3. 三维数组元素的指针表示
三维数组可以看作是元素是一维数组的二维数组或元素是二 维数组的一维数组,故其指针表示可参照二维数组元素的指 针表示方法分一级、二级、三级等,不再详述。
cout<<"pd2-pd1=(地址差)"<<(int)pd2-(int)pd1<<endl;
}
先在VC++下执行该程序,与同学共同思考为什么是这样的结果?
5.2 数组与指针
5.2.1 数组名是一个常量指针
5.2.2 用指针表示数组元素
5.2.3 指向数组的指针 5.2.4 指针数组 5.2.5 字符指针与字符串处理函数
如果将一个变量的地址放在另一个变量中,则存放地址
的变量称为指针(pointer)型变量。这样存取变量,也可以
间接的由指针变量取得该变量的地址进行,称为“间接访问”
方式。
由于指针变量中的值是另一个变量的地址,我们习惯上
形象地称指针变量指向该变量。指针变量中的值也简称为指
针,所以指针就是地址。
设a是整型变量,其值为5,其分配的内存地址为1000H(H
C语言之指针
![C语言之指针](https://img.taocdn.com/s3/m/c55f79fc700abb68a982fb5b.png)
指针一、指针的概念指针即地址,一个变量的指针就是指该变量的地址。
注意:指针变量中只能存放地址。
二、指针变量的定义和引用1、指针变量的定义int *p; 此语句定义了一个指针变量p,p中可存放一个整型变量的地址。
注意:①*是指针变量的特征②只是分配了一个存储单元,并没有指真正指向,要想使一个指针变量指向一个整型变量必须赋值。
例如::int *p,I=3;p=&I;如果p=3就是错误的。
2、指针变量的引用(两个有关指针的运算符)①& 取地址运算符号②* 指针运算符*p表示p所指向的变量值。
int *p,a;p=&a; /*指向变量a的值赋给p*/scanf(“%d”,p);/*从键盘输入一个值赋值给p所指向的变量a*/*p=5; /*把5赋值给变量p所指向的a*/三、指针作为函数参数函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型,它的作用是将一个变量的地址传送到另一个函数中四、指针与数组1、一维数组的指针表示方法(1)数组中各元素的地址。
int a[10]={1,2,3,4,5,6,7,8,9,10};①&a[0] &a[1] &a[2] 、、、&a[i]、、、&a[9]②a a+1 a+2 、、、a+i、、、、、a+9(2)数组元素值①a[0] a[1] a[2] 、、、、a[i]、、、、a[9]②*(a+0) *(a+1) *(a+2)、、*(a+i) *(a+9)2、二维数组的指针表示方法例:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};1、每行的起始地址①&a[0][0] &a[1][0] &a[2][0]②a[0] a[1] a[2]③a+0 a+1 a+2④*a *(a+1) *(a+2)⑤&a[0] &a[1] &a[2]2、各元素的地址①&a[0][0] &a[0][1] &a[0][2]②a[0]+1 a[0]+2 a[1]+2③*a+1 *(a+1)+1 *(a+2)+23、各元素的值①*(&a[0][0]) *(&a[0][1]) *(&a[0][2])②*(a[0]+1) *(a[0]+2) *(a[1]+2)③*(*a+1) *(*(a+1)+1) *(*(a+2)+2)四、指针与数组;printf(“%d”,*p);注意:int (*p)[5]表示p是指针变量,它指向一个包含5个元素的一维数组int *p[5] 是指针数组。
C语言程序设计第八章 指针的使用
![C语言程序设计第八章 指针的使用](https://img.taocdn.com/s3/m/a671ab6bf12d2af90242e6f0.png)
第八章指针的使用【学习目标】本章将详细介绍在C语言中如何使用指针。
学习要点包括如下几点:(1)掌握指针和指针变量的概念,了解指针变量的特点以及直接访问数据和间接访问数据的原理。
(2)掌握指针变量的定义、赋值方法及指针运算符的使用,熟练运用指针访问简单变量。
(3)熟悉指针和一维数组的关系,掌握指向一维数组的指针变量的定义方法,熟练使用指针变量访问一维数组元素。
(4)了解指针与字符串的关系,能熟练使用指针处理字符串。
(5)熟练掌握用指针变量作函数的参数时函数的定义和调用方法、数组名作函数的参数用法。
(6)指向指针的指针的运用。
【学习导航】本章的在整个课程中的位置如图5-1所示。
图8-1 本章学习导航在本书的第一章介绍C语言有一个灵活性的特点,那么它的灵活性具体体现在哪里呢?其实就是指针。
指针是C语言的精华部分,通过利用指针,我们能很好地利用内存资源,使其发挥最大的效率。
有了指针技术,我们可以描述复杂的数据结构,对字符串的处理可以更灵活,对数组的处理更方便,使程序的书写简洁,高效。
8.1 地址和指针指针是C语言的一种数据类型,类似于整型、字符型等。
既然指针也是一种类型,那么也可以定义该类型的变量,称为指针变量。
指针变量和其他类型的变量的区别是:指针变量存储的是地址。
所以要学好指针,就一定要明白数据在内存中是如何存储的。
计算机所有数据都是存储在存储器里,系统的内存可看作编了号的小房间,如果要取房间的东西(读取数据)就需要得到房间编号。
地址就是内存区中对每个字节的编号。
下面通过两个整型变量来说明。
整型变量x、y(基本整型需4个字节)在内存中的存储如图8-2所示(假设内存编号是从2000开始)。
把变量所占用的存储单元首字节的地址作为变量的地址。
C语言中利用取地址运算符“&”获取变量的存储地址。
例如,&c将返回c的首地址;&x将返回x的首地址。
2000H2004H2008H2012H...图8-2 变量x和y在内存中的存储图8-2中2000H和2004H就是内存单元的地址。
举例说明指针的定义和引用指针所指变量的方法
![举例说明指针的定义和引用指针所指变量的方法](https://img.taocdn.com/s3/m/a5e2a44091c69ec3d5bbfd0a79563c1ec5dad7f5.png)
举例说明指针的定义和引用指针所指变量的方法摘要:一、指针的定义二、引用指针所指变量的方法三、指针在实际编程中的应用示例正文:在计算机编程中,指针是一种非常重要且实用的概念。
它是一种存储变量地址的数据类型,通过指针可以间接访问和操作内存中的数据。
下面我们将详细介绍指针的定义、引用指针所指变量的方法以及指针在实际编程中的应用。
一、指针的定义在C/C++等编程语言中,指针是一种特殊的数据类型,它的值表示另一个变量在内存中的地址。
指针变量声明的一般形式为:`typedef int*ptr_to_int;`其中,`int`表示指针所指变量的数据类型,`ptr_to_int`表示指针变量。
声明指针后,我们需要为其分配内存空间,这可以通过`malloc`等内存分配函数实现。
二、引用指针所指变量的方法在实际编程中,我们通常需要通过指针来操作所指变量。
引用指针所指变量的方法有两种:1.直接访问:使用`*`运算符,如`*ptr = 10;`表示将10赋值给指针ptr所指的变量。
2.间接访问:使用`->`运算符,如`ptr->name = "张三";`表示将字符串"张三"赋值给指针ptr所指的结构体中的name成员。
三、指针在实际编程中的应用示例1.动态内存分配:在程序运行过程中,根据需要动态分配内存空间,如使用`malloc`分配内存,然后通过指针访问和操作分配的内存。
2.函数参数传递:使用指针作为函数参数,可以实现函数对实参的修改,如`void swap(int *a, int *b);`这个函数接受两个整型指针作为参数,实现两个整数的交换。
3.链表:在链表中,每个节点都包含一个指向下一个节点的指针,通过遍历链表的指针,可以实现对链表中数据的访问和操作。
4.结构体:结构体中的成员可以是不同类型的数据,通过指针可以访问结构体中的各个成员,如在学生信息管理系统中,可以使用指针访问学生姓名、年龄等成员。
C语言指针
![C语言指针](https://img.taocdn.com/s3/m/ccaa86934a7302768e9939fe.png)
#include <stdio.h>
void main()
{ int a=5,b=3;
int *p;
10
p=&a;
4,4
b=*p+5;
printf(“%d\n”,b);
*p=4;
printf(“%d,%d”,a,*p);
}
三、数组的指针与函数实参
例:编写一函数求一维数组的最大元素及其下 标位置(要求使用指针) 已知:数组首地址p,元素个数n;(作函数参 数) 结果:下标k;(作返回值) int max_array(int *p,int n) 设最大值放在max中,则初始状态为:
max=*p, k=0 如果*(p+i)>max 则max=*(p+i)且k=i
a[i] &a[i][0] *(a+i)
数组元素地址
a+i &a[i]
不要把&a[i]理解为a[i]单元的物理地址,因为 a[i]不是一个变量, &a[i] 和a[i]的值是相等的。但 含意不一样。前者指向行,后者指向列; &a[i]:第i行的首地址 a[i]:第i行0列地址 &a[i]+1:第i+1行的首地址 a[i]+1:第i行1列的地址
指针变量作函数参数
例:编写一个函数实现两个数的交换。
#include<stdio.h>
#include<stdio.h>
void swap(int x,int y) void swap(int *x,int *y)
指针变量与指针变量的引用_C语言程序设计_[共3页]
![指针变量与指针变量的引用_C语言程序设计_[共3页]](https://img.taocdn.com/s3/m/3bc848e85727a5e9846a615e.png)
1728.2 指 针 变 量变量的指针就是变量的地址。
存放变量地址的变量是指针变量。
在C语言中,用指针变量存储变量的地址。
因此,一个指针变量的值就是某个变量的地址或某变量的指针。
8.2.1 指针变量的定义对指针变量的定义包括3个内容:指针类型说明,即定义变量为一个指针变量;指针变量名;变量值(指针)所指向的变量的数据类型。
其一般形式为:类型说明符*变量名;其中,*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示该指针变量所指向的变量的数据类型。
例如: int *p1;p1是一个指针变量,它的值是某个整型变量的地址。
或者说p1指向一个整型变量。
至于p1究竟指向哪一个整型变量,应由赋给p1的地址来决定。
8.2.2 指针变量与指针变量的引用(1)&和*运算符指针变量和普通变量一样,使用之前必须先定义并初始化。
未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。
指针变量的赋值只能赋予地址,决不能赋予任何其他数据,否则将引起错误。
在C语言中,变量的地址是由编译系统分配的,对用户完全透明,用户不能直接看到变量的具体地址,但可以通过“&”运算符获得变量的地址。
两个相关的运算符如下。
&:取地址运算符。
*:指针运算符(或称“间接访问”运算符)。
①C语言中提供了地址运算符&来获取变量的地址。
其一般形式为:&变量名。
如:&a表示变量a的地址,&b表示变量b的地址。
设有指向整型变量的指针变量p,如要把整型变量 a 的地址赋予p可以有以下两种方式。
指针变量初始化的方法:int a;int *p=&a;指针变量赋值的方法:int a;int *p;p=&a;②为了表示指针变量和它所指向的变量之间的关系,在程序中用“*”符号表示“指向”,如图8-2所示,i_pointer代表指针变量,而*i_pointer是i_pointer所指向的变量i。
指针变量的定义和运算指针变量作函数参数
![指针变量的定义和运算指针变量作函数参数](https://img.taocdn.com/s3/m/06e790af7d1cfad6195f312b3169a4517723e539.png)
char *pc; pc = "I am a student!"; 也可用初始化赋值的方法写为: char *pc = " I am a student!";
回顾字符数组的赋值!
不表示把整个字符串 装入指针变量,只是 把字符串的首地址装 入指针变量。
第19页/共35页
指针变量的加减运算1
➢ 对于指向数组的指针变量,可以加上(或减去) 一个整数n。
感谢您的观看!
第35页/共35页
当输入数据后,a的值比b大,则需要交换它们的值。
➢ 流程图
➢ 源程序
输入两个整数 a 和 b
temp=p1
看源程序 (3_8)
运行程序
def a
main
>
函数
b
调用 swap 函数 交换 a 和 b 的值
def
swap
p1=p2
(p1, p2)
p2=temp
(3_8)
输出 a 和 b 的值
思考:正确吗?为什么?
运行程序 (3_4)
第22页/共35页
指针变量的关系运算
➢ 指向同一数组的两指针变量可以进行关系运算, 表示它们所指数组元素的地址之间的大小关系。 例如:右图中,表达式“p2>p1”的值为?真
➢ 任何类型的指针变量还可以与
NULL进行比较。
p1
例如:设p为指针变量,
“p==NULL”为真时表示p是空指针, 它不指向任何变量; p2
➢ 源程序
#include "stdio.h"
void main()
{ char *s = "CProgram!";
char *p = s;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(2) 定义指针变量时,不仅要定义指针变量名,还必须指出指针变量所指向的变量 的类型即基类型,或者说,一个指针变量只能指向同一数据类型的变量。由于不同类型的数 据在内存中所占的字节数不同,如果同一指针变量一会儿指向整型变量,一会儿指向实型变 量,就会使该系统无法管理变量的字节数,从而引发错误。
2. 指针变量的初始化 在指针变量定义好了之后,如何来使用指针,它与普通变量有什么不同,这是我们下面
者说这个指针指向整型变量 a,也可以说是指针变量 p 指向整型变量 a 。
系统对变量访问形式分为以下两种:
(1)直接访问
按变量地址存取的变量值的方式称为“直接访问”方式。
说明:用变量名对变量的访问也属于直接访问,因为在编译后,变量名和变量地址之间
有对应关系,对变量名的访问系统自动转换成利用地址对变量的访问。如图 7.4a (2)间接访问 将变量的地址存放在一种特殊变量中,利用这个特殊变量进行访问。如图 7.4b 所示,
在定义指针变量时同时给指针一个初始值,称为指针变量初始化。 例如:
int a=20,b=5;
/* 定义两个整型变量 a,b 并初始化 */
int *pa=&a;
/* 将变量 a 的地址赋给指针变量 pa */
float x,*px=&x;
/* 定义单精度实型变量 x,并将变量 x 的地址赋给指针变量 px */
float *q;
/* 定义了一个指向单精度实型变量的指针变量 q */
double *d;
/* 定义了一个指向双精度实型变量的指针变量 d */
char *c; 几点说明:
/* 定义了一个指向字符型变量的指针变量 c */
(1) C 语言规定所有变量必须先定义后使用,指针变量也不例外,为了表示指针变 量是存放地址的特殊变量,定义变量时在变量名前加指向符号“*”。
下面看一个完整的例子:
【例 7.1】用两种不同的方法输出变量的值。 /*源程序名:CHlt;stdio.h>
/*02*/ main()
/*03*/ {
/*04*/
int a=18,*p=&a; /* 定义整型变量 a,同时定义指针变量 p,并对 p 初始化*/
图 7.2 变量在内存中的表示
7.1.2 指针和指针变量
在前面我们说过,指针就是地址。而指针
变量就是存放地址的变量。就像我们学过的整
型、实型等数据类型一样,指针也是一种数据
类型,回想我们以前学过的数据类型,整型变
量的值是整数,实型变量的值是实数,那么指
针变量的值就是指针,也就是地址。
程序要访问内存里的某一个变量,首先要
7.2.2 指针变量的引用
指针变量一旦定义好了,我们就可以引用它。对指针变量的引用包含两个方面:一是对 指针变量本身的引用,如对指针变量进行的各种运算;二是利用指针变量来访问所指向的目
标,对指针的间接引用。
1. 指针运算符、地址运算符与下标运算符 与指针相关的三个运算符:&、*、[ ] 均以内存地址作为操作数。 (1)&:取地址运算符,在前面已经讨论过,在此不再赘述。
/*05*/ printf("a=%d\n",a); /* 输出整型变量 a 的值 */
/*06*/
printf("*p=%d\n",*p); /* 输出指针变量 p 指向的目标的值 */
/*07*/ } 程序运行结果:
a=18 *p=18 上例中,两个输出语句输出的结果相同,说明指针变量 p 所指向的目标就是整型变量 a。
7.1 指针的概念
指针就是地址,指针变量是一个特殊的变量,它里面存储的数值被解释成为内存里的一 个地址。指针变量就是存放地址的变量, 要搞清一个指针需要从四个方面的内容来理解: 指针的类型,指针所指向的类型,指针的值或者叫 指针所指向的内存区,还有指针本身所占据的内存 区。
为了便于理解指针的概念,我们有必要讨论一 下计算机内存和数据的关系。我们知道,程序要装 入内存才能够运行,数据也只有装入内存才能被程 序处理,那么程序和数据在内存中的组织形式是怎 样的呢?内存又是什么样的呢?内存是计算机用于 存储数据的存储器,以一个字节作为存储单元,为 了便于访问,给每个字节单元一个唯一的编号,第 一字节单元编号为 0,以后各单元按顺序连续编号,
第一行先定义了整型变量 a,并为之分配两个存储单元;第二行再定义一个指向整型变
量的指针变量 pa,在内存中就为指针变量分配了一个存储空间,同时通过取地址(&)运
算符把变量 a 的地址赋给 pa,也就是放在程序为指针变量 pa 分配的存储空间中。这样,指
针变量 pa 就指向了确定的变量 a。同理,px 指向变量 x。
若有定义:
int a,﹡p=&a; 说明指针 p 指向整型变量 a,a 是 p 指向的目标,可以用*p 来引用 a,*p 与 a 是等价的, 因此,*p 可以像普通变量一样使用。 例如:
int a,﹡p=&a;
/* 定义整型变量 a,指针变量 p,并把 a 的地址赋给 p */
a=12;
/* 对变量 a 进行赋值 */
特殊变量 p 存放的内容是变量 x 的地址,利用变量 p 来访问变量 x 的方法称为“间接访问”。
图 7.4a 直接访问
图 7.4b 间接访问
在 C 语言中,如果变量 p 中的内容是另一个变量 x 的地址,则称变量 p 指向变量 x,或 称 p 是指向变量 x 的指针变量,形象地用图 7.4b 所示的箭头表示。
(2)*:指针运算符或称间接访问(引用)运算符。取指针所指向的目标的值。* 右边 的操作数必须是指针,且它已与确定目标建立了联系。
(3)[ ]:下标运算符。取指针所指向的目标的值。[ ] 左边的操作数必须是指针,且 它已与确定目标建立了联系。下标运算符一般在数组中用的比较多。
指针指向的对象可以表示成如下形式:
将要讨论的问题。先看如下的指针变量的定义:
int *pa,*pb;
float *pf; 上面两行说明语句仅仅定义了指针变量 pa,pb,pf,但这些指针变量指向的变量(或内存 单元)还不明确,因为这些指针变量还没被赋于确定的地址值,这时指针变量里的地址值是 随机的。只有将某一具体变量的地址赋给指针变量之后,指针变量才能指向确定的变量(内 存单元)。
*p=12;
/* 对*p 进行赋值,也就是对变量 a 进行赋值 */
printf("%d%d",*p,a); /* 以不同的形式输出变量 a 的值 */ 上述第二、三条语句都是对变量 a 赋值,而第四条语句是以不同的形式输出变量 a 的值。 再观察下面三语句:
指针是 C 语言的重要数据类型,也是 C 语言的精华所在。学好 C 语言中的指针能帮助 我们编写高效、正确和灵活的程序。指针、地址、数组及其相互关系也是 C 语言中最有特 色的部分。规范地使用指针, 可以使程序达到简单明了,灵活高效的效果。 因此, 在 C 程序设计中,我们不但要善于使用指针,而且还要学会在各种情况下灵活、正确地使用指针 变量。
由此可以得出结论:变量的指针即为变量的地址,而存放其它变量地址的变量是指针变 量。
7.2 指针变量的定义和引用
7.2.1 指针变量的定义和初始化
1. 指针变量的定义 我们知道变量在计算机内是占有一块存贮区域的,变量的值就存放在这块区域之中, 在
计算机内部, 通过访问或修改这块区域的内容来访问或修改相应的变 量。C 语言中,对于 变量的访问形式之一,就是先求出变量的地址,然后再通过地址对它进行访问,这就是这里 所要论述的指针及其指针变量。
*指针变量
特别要注意的是,此处*是访问指针所指向变量的运算符,与指针定义时的*不同。在定 义指针变量时,* 号表示其后是指针变量。在其它位置出现,* 号是运算符。如果与其联系 的操作数是指针类型,*是间接访问(引用)运算符;如果与其联系的操作数是基本类型,*是 乘法运算符。在使用和阅读程序时要严格区分* 号的含义。
第 14 讲 指针变量的定义和引用
【学习目标】
掌握各种类型指针的定义、初始化;掌握指针的使用方法;理解指针的概念。
【重 难 点】
重点: 变量的地址和指针概念的建立,指针变量的定义和引用 难点: 指针概念及指针变量的引用
【学时安排】
学时:2 学时
【知 识 点】
7.1 指针的概念........................................................................................................................1 7.1.1 变量的地址.............................................................................................................2 7.1.2 指针和指针变量.....................................................................................................2
7.2 指针变量的定义和引用.....................................................................................................3 7.2.1 指针变量的定义和初始化......................................................................................3 1. 指针变量的定义..........................................................................................................3 2. 指针变量的初始化......................................................................................................4 7.2.2 指针变量的引用......................................................................................................4