变量的指针与指针变量.
第十章 指针
19
10.4 字符串与指针
字符串的表示形式
1. 可以用字符数组表示字符串
main() { char string[]=”I love China!”; printf(“%s\n”, string); }
2. 可用字符指针变量来表示
main() { char *string=”I love China!”; printf(“%s\n”, string); }
9
10.2.2 指针变量的引用
& :取地址运算符 * :指针运算符
i_pointer-----指针变量,它的内容是地址量 Eg10.1 *i_pointer----指针的目标变量,它的内容是数据 &i_pointer---指针变量占用内存的地址 main() &*i_pointer等价于i_pointer { (&*i_pointer)++与&*i_pointer++的区别 int a,b; int *pointer_1,*pointer_2; a=100;b=10; pointer_1=&a; pointer_2=&b; printf("%d,%d\n",a,b); printf("%d,%d\n",*pointer_1,*pointer_2); }
21
10.5 指向函数的指针
赋值 函数名代表该函数的入口地址。因此,可用 函数名给指向函数的指针变量赋值。 指向函数的指针变量=[&]函数名;
注意:函数名后不能带括号和参数;函数名前的 “&”符号是可选的。
调用格式 (*函数指针变量)([实参表])
22
用指向函数的指针作函数参数
《c++程序设计》第7章 指针
(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章指针
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)
指针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程序设计
指针变量作为函数参数
• 指针变量也可作为函数参数,其作用就是 通过函数传递,将变量的地址传到另一个 函数中去 • 指针变量函数参数可以实现在被调函数中 操作主调函数中的变量。 • 各式如下:行参是指针变量;实参可以是 变量的地址,或指针变量。
变量的指针和指针变量的区别是什么
2变量的指针和指针变量的区别是什么。
答;一个变量的地址指出了变量的存储单元在内存中的具体位置,能对变量进行存取操作。
这个变量的地址就是变量的指针。
指针是一种具有特殊意义的整型数,指针不能存放在一般的整型变量中,必须存放在专门指针的变量中,这类变量就是指针变量。
3 一维数组元素的引用有哪些方式。
答;下标法、地址法、指针法4 2维数组列地址有哪些计算方法。
答;1 根据数组元素所在的行计算出行地址,然后把行地址转换成行中首元素的地址,再根据数组元素所在的列计算数组元素的地址。
2 根据2维数组的数组元素在存储空间上按行连续存放的特点,每个数组元素的地址等于2维数组元素的首元素地址加上该数组元素相对于首元素位置的偏移量。
3把2维数组的每一行当作一个一维数组,用一维数组元素地址的计算方法计算相应的2维数组元素的地址。
第9章结构体与共用体1 什么是链表。
其中单向链表具有哪些特点。
答;链表是若干个同样类型的结构通过依次串接方式构成的一种动态数据结构。
链表中的每一个结构体数据成为结点,链表可以分成单向链表和双向链表单向链表的特点;1 链表中的结点数据可以改变的2 结点占用的内存是动态分配内存和动态释放内存函数。
2 对单向链表的常用操作有哪些。
答;对单向链表的常用操作有建立、显示、插入,删除和查找。
3 什么是共用体。
答;共用体是一个集合体。
它的各个成员的数据类型可以是不相同的,所有成员共享同一段存储空间,存储空间的大小取决存储单元最大的成员的数据类型。
4 指向结构体类型变量的指针变量引用形式有哪些。
答;有两种形式;【星号指针变量名】。
成员名和指针变量名-大于号成员名。
第10章位运算及编译预处理1 C提供的编译预处理功能有哪些。
如何实现。
答;功能有三种;宏定义、文件包含和条件编译,分别用宏定义命令、文件包含命令、条件编译命令实现。
2 文件包含的基本功能是什么。
答;文件包含处理是一个源文件可以将另一个源文件的全部内容包含到本文件中来,作为本文件的一部分,这可以节省程序设计人员的重复劳动。
《C语言》指针 ppt课件
ppt课件
14
p1 buf main
p bubfu+f105
p2 buf+10
aalllloocc
bbeeggiinn bubfu+f10 nn 150
ppt课件
1 buf[0]
2 buf[1]
:
:
9
:
\0 buf[9]
a buf[10]
:
:
\0 buf[14]
第6章 指针
6.1 指针定义与使用 6.2 指针与函数 6.3 指针与数组 6.4 指针与字符串 6.5 指针数组与多级指针 6.6 指针与动态内存分配 6.7 指针的深层应用
ppt课件
1
6.1 指针的引出
一. 地址与指针
1. 地址与取地址运算
C程序中的变量在内存中占有一个可标识的存储区,
d = *(++p) ; { ++p ; d = *p ; }
执行后 d 的值为 3 , *p 的值为 3
1010 23 a 5b 3c 3d
ppt课件
7
例6. 2
#include <stdio.h> void main( )
p1 &ba
5a
{ int *p1 , *p2 , *p , a , b ; scanf(“%d%d”, &a , &b);
p2 &ba
9b
p1 = &a ; p2 = &b ;
if (a<b) { p = p1 ; p1 = p2 ;
p &a
输出结果:
p2 = p ;
第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++指针
20
sub( int *s) i=0 t=*s+t=0 k=0 sum=0 { static int t=0; i=1 t=*s+t=1 k=1 sum=1 t=*s + t; return t; i=2 t=*s+t=3 k=3 sum=3 } i=3 t=*s+t=6 k=6 sum=6 int main(void) { int i, k; for (i=0; i<4; i++) sum=0 { k=sub(&i); sum=1 cout<<“sum=“<<k<<‘\t’; sum=3 } sum=6 cout<<“\n”; }
用指针变量作函数参数,可以得到多个变化 了的值。
18
void prt(int *x , int *y , int *z) { cout<< ++*x<<‘,’<< ++*y<<‘,’<<*(z++)<<endl;} int a=10, b=40, c=20; int main(void) 11, 41, 20 { prt (&a, &b, &c); 12, 42, 20 prt (&a, &b, &c); } a x
通过指针变量为 数组元素赋值
a[0]=1;
2010H 2014H 2018H
C++规定,p+1指向数组的下一个 元素,而不是下一个字节。 *(p+1)=2; *++p=2; a[1]=2;
201CH
C语言0指针解读
a
5
b
3AB0 p
1.如何定义p? 2.如何获得变量a的地址? 3.如何通过p访问a?
首页 上页 下页 返回
8.1 指针的概念 1.如何定义 p? 2.如何获得变量a的地址? 3.如何通过p访问a? 三、指针变量:存放地址的变量 如:p为指针变量,它存放整型变量a的首地址 我们称,指针变量p指向整型变量a
在C语言中,将地址形象化地称为指针
3AB0 3 a 3AB8 5 b 3AB0 p
首页 上页 下页 返回
指针说明符
8.2指针变量的定义与引用
如:int *p1,*p2; char *ps; float *pf1,*pf2;
一、定义方法 类型符 *指针变量名
指针变量 的类型
如:int a,b,*p; 指针变量的类型:所指向的 p=&a; 内存中存放的数据的类型 int *p1; p1=0x3AB0;错 二、指针变量的赋值 指针变量的值为地址,是个无符号整数 但不能直接将整型常量赋给指针变量。
首页 上页 下页 返回
例题:8.2两个数进行从大到小排序
首页Biblioteka 上页下页返回
交换两个数a、b的值
#include <stdio.h> void main() {int a=5,b=8; int *pa=&a,*pb=&b; int t; printf("a=%d b=%d\n",a,b); t=*pa; *pa=*pb; *pb=t; printf("a=%d b=%d\n",a,b); }
第8章 指针
1. 2. 3. 4. 5. 6. 7. 8. 指针是什么 指针变量 通过指针引用数组 通过指针引用字符串 指向函数的指针 返回指针值的函数 指针数组和多重指针 动态内存分配与指向它的指针变量
第七章 指针
指针
华厦职业学院
C语言程序设计
在这一章中将介绍C语言程序的指针,指针是 一内存中的地址,任何一个变量在内存中都有一个 空间,这个空间有一个地址,这个地址就是变量的 指针,通过指针可以实现对内存的直接访问。
华厦职业学院
C语言程序设计
8.1 8.2 8.3 8.4 8.5 8.6 8.7
指针概述 指针与函数参数 指针与数组 数组与函数参数 字符串与指针 指针与二维数组 动态数组
华厦职业学院
C语言程序设计
指针变量的赋值
指针变量是一个可以存储指针值的变量,在32位系 统中它占4个字节,可以把一个变量用&取地址后赋 值给这个指针变量,例如:
int a=1,*p; p=&a; 此时p存储了变量a的地址。注意变量p本身也是一个变量, 它自己也有一个存储单元,这个存储单元显然与变量a的 存储单元是不同的,变量a的存储单元存储的是变量a的值, 而变量p存储单元存储的是变量a单元的地址,如图7-3所 示。
华厦职业学院
C语言程序设计
通过指针访问变量
既然指针变量指向一个变量,因此通过指针变 量也就知道变量的位置,知道位置也就能访问到变 量,可以通过指针变量存取变量的值。
华厦职业学院
C语言程序设计
C中规定通过:
*指针变量 来访问对应变量的值,例如: • int a=1,b,*p; • p=&a; • *p=2; // 设置p指向的变量的值为2,既a=2 • b=*p; // 把p指向的变量的值赋予b,既b=2 在C语言中,系统对“*指针变量”的解释是根据指 针变量的类型计算出对应变量所占字节数,之后把指针变 量所指的连续的几个字节的二进制数据看成是与指针变量 同类型的数据并存取这一include <stdio.h> void fun(int *p,int b) { printf("fun中: p=%p *p=%d &b=%p b=%d\n",p,*p,&b,b); *p=100; b=100; } void main() { int a=1,b=2,*p; p=&a; printf("调用前: p=%p a=%d &b=%p b=%d\n",p,a,&b,b); fun(p,b); printf("调用前: p=%p a=%d &b=%p b=%d\n",p,a,&b,b); }
第9章 指针
第九章指针指针是C语言的一个重要概念,也是C的一个重要特色。
正因为有了指针,C语言才可以灵活有效的表示复杂的数据结构,更方便地处理诸如内存、字符串、数组、函数等。
可以说,不掌握指针就不能掌握C的精华。
一、地址和指针的概念地址的概述1、存储器地址计算机所处理的数据,总是要存储在一定的存储介质上,例如内存。
而这些数据的存储,又是有一定先后顺序的。
因此我们通常将这些存储介质上的一个个用于存放数据的基本单元进行线性编址,即按照一定的顺序给每个存储单元(字节)一个编号,这个编号就是该单元的地址。
一般情况下,地址总是从0开始的一系列整数。
某个地址就代表某个存储单元,就如一个房间号Array码对应于一个实际的房间一样。
2、存储单元的内容这是不同于地址的另一概念,它是指某地址单元内具体存放的数据,如一个字符、一个整数、实数或一个字符串。
例:如右图100,101,102,…,205,206等即是地址;160单元的内容就是字符C,161单元的内容就是字符H,…,等。
3、变量的访问一般情况下,程序中的一个变量就对应存储器的若干个单元,对变量的访问可以简单地认为是通过变量名来对内存单元进行存取操作。
实际上,程序在编译之后,变量名已经转化为了与该变量对应的存储单元地址,因而对变量的访问就是通过地址对存储单元的访问。
1)直接访问按照变量地址来对变量进行存取的方式,称为直接访问方式。
例如:右表中对变量a的读取:printf(“%d”,a),其实是先找到a的地址160,然后从160开始读取一个字节的字符‘C’;同理用scanf(“%d”,&b)输入b的值时,在执行时,直接把从键盘输入的数据‘H’送入从地址为161开始的字节单元中。
2)间接访问通过另一变量间接获取某变量的地址,从而间接实现对原变量的访问的方式,称为间接访问方式。
例如:将变量a的地址160存放在另一个变量当中,见上表p=160,那么,对变量a的访问也可以为:先通过变量p的地址205找到该单元的数据160,再将160视为地址,该地址单元内容就是变量a的值(字符‘C’)。
指针
(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; -----间接访问
计算机二级等级考试C语言关于指针的讲解
如果有: 则内存情况如图8-1 如果有:int a=5;则内存情况如图 则内存情况如图 所示。 所示。 •a是存储单元(即变量)的名字, 是存储单元(即变量)的名字, • 5是存放在存储单元中的内容, 是存放在存储单元中的内容 是存放在存储单元中的内容, •存储单元的地址是2000。 存储单元的地址是 存储单元的地址 。
注意: 注意:
p++; /* 相当于 相当于p=p+1; */ 等价于*(p++) 特殊表达式: 特殊表达式: 不等价于(*p)++ *p++; 和 *p--; 先取用对象(*p),然后 自加减 自加减1 先取用对象( ,然后p自加减 ++*p;与 *++p; 完全相同 与 --*p;与*--p;完全相同 , 与 完全相同 这四种形式都是p先自加减 ,然后再取用对象 这四种形式都是 先自加减1,然后再取用对象 先自加减
本章考点
指针与指针变量的概念。 指针与指针变量的概念。 指针变量的运算。 指针变量的运算。 一维数组的地址、指向一维数组的指针及其应用。 一维数组的地址、指向一维数组的指针及其应用。 二维数组的地址、指向二维数组的指针及其应用。 二维数组的地址、指向二维数组的指针及其应用。 指针数组的概念及其应用。 指针数组的概念及其应用。 用指针表示字符串。 用指针表示字符串。 指针变量作为函数参数。 指针变量作为函数参数。 指向指针的指针变量及其应用。 指向指针的指针变量及其应用。 命令行参数的基本概念。 命令行参数的基本概念。
b[i] &b[i][0] 代表第 行0列元素的地址 代表第i行 列元素的地址 列元素的地址.
b b+1 b+2 则:b *b *(b+i)
c语言第9章_指针及其应用(1)课后复习重点[1]教程
指针变量在使用前
必须赋值!
swap(pointer_1,pointer_2);
printf("a=%d,b=%d\n", *pointer_1,*pointer_2); return 0; } 2018/11/2
运行结果:
a:10 *pa:10
...
printf("&pa:%x(hex)\n",&pa);
return 0; }
&a:f86(hex)
pa:f86(hex) &pa:f8a(hex)
16
2018/11/2
例:输入两个数,并使其从大到小输出
int main()
{
int *p1,*p2,*p,a,b; scanf("%d,%d",&a,&b);
24
例:交换两个数—形参和实参都为指针变量
void swap(int *p1, int *p2) { int *p; int x,*p=&x; *p=*p1; *p1=*p2; *p2=*p; } int main() { int a=7,b=11; int *pointer_1=&a,*pointer_2=&b;
2018/11/2
9
例: void main( ) { int i=10; 危险! int *p; *p=i; printf("%d",*p); } 例: void main( ) { int i=10,k; int *p; p=&k; *p=i; printf("%d",*p); } 2018/11/2
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)将变量地址值赋给指针变量,使指针指向该变 量。
chap8(指针)
务必记住:*(a+i) 和 a[ i] 是等价的。
如果 a 是一维数组名,则a[ i]代表第 i+1个元素所占的 内存单元。但如果a是二维数组,则a[ i ]代表一维数组名, a[i]本身是不占用内存单元的, 也不存放元素值,而只是 一个地址。 a、a+i、a[ i]、*(a+i)、*(a+i)+j、a[ i]+j都是地址, 而*(a[ i]+j)、*(*(a+i)+j)是二维数组元素a[ i][ j]的值。
二、 字符串指针作函数参数
可以用地址传递的方式,即用字符数组名作 参数或用指向字符串的指针变量作参数,将一个 字符串从一个函数传递到另复制。 用字符数组作参数 void copy_string( from , to ) char from[ ] , to[ ] ; { int i = 0 ; while ( from[i] != „\0‟ ) { to[i] = from[i] ; i + + ; } to[i] = „\0‟ ; 运行结果: } string_a = I am a teacher. string_b = I am a teacher. main( ) {char a[ ] = “I am a teacher.” ; char b[ ] = “you are a student.” ; copy_string( a , b) ; printf( “string_a = %s\nstring_b = %s\n”,a,b); }
形参用字符指针变量 void copy_string(from , to) char *from , *to ; { for ( ; *from != „\0‟; from++; to++) *to = *from ; *to = „\0‟; } main( ) { char *a= “I am a teacher.”; char *b= “you are a student.”; copy_string(a,b); printf( “string_a = %s\nstring_b = %s\n”,a,b) ; }
c语言 第9章_指针及其应用(1)课后复习重点[1]
指针变量必须先赋值,再使用
...
2000
10
整型变量i
2004
2008
变量k
10
指针变量p 随机 2004
2012
...
10
int i; float *p; p=&i;
一个指针变量不能指向 与其类型不同的变量!
应在类型相同的指 针变量之间赋值 int *p; float *q; p=q;
int *p; p=100;
23
例:交换两个数—形参和实参都为指针变量
void swap(int *p1, int *p2) { int *p; p=p1; p1=p2; p2=p; } int main() { int a=7,b=11; int *pointer_1=&a,*pointer_2=&b;
printf("a=%d,b=%d\n",a,b); printf("swapped:\n"); 调用结束 调用前 调用中
用于存放某个内存单元地址的变量。
(指向某内存单元的指针)
例如: char c = 'K'; char *p ;
p = &c;
p(4000) 2000 c(2000)
*p
75
2015/12/30
6
指针变量的声明
指针变量的声明格式: 数据类型 *变量名; – "*": 声明一个指针类型的变量; – "数据类型":指针变量所指向的变量的数据类型。
2015/12/30
9
例: void main( ) { int i=10; 危险! int *p; *p=i; printf("%d",*p); } 例: void main( ) { int i=10,k; int *p; p=&k; *p=i; printf("%d",*p); } 2015/12/30
c语言程序设计第五版习题答案
习题解析与答案第1章C语言概述一.简答题1.概述C语言的主要特点。
【解答】(1)语言简洁、紧凑,使用方便、灵活。
(2)数据类型丰富,表达能力强。
(3)运算符多样。
C语言中的运算符包含的范围非常广泛。
(4)具有结构化的控制语句。
如if…else语句、while语句、do while语句、switch 语句、for语句。
(5)允许直接访问物理地址。
C语言中含有的位和指针运算,能够直接对内存地址进行访问操作。
(6)所生成的目标代码质量高,可移植性好。
2.构成C语言程序的基本单位是什么?它由哪几部分组成?【解答】函数是构成C语言程序的基本单位。
一个完整的C程序一般由文件包含、宏定义、函数说明、变量和一个或若干个函数组成。
3.C语言程序的运行一般要经过哪几个步骤?【解答】(1)编辑;(2)编译;(3)连接,生成EXE文件;(4)执行。
二.运行程序写结果1.输入下面程序并运行。
main(){int a1,a2,x;a1=100;a2=50;x=a1-a2;printf(″x=%d\n″,x);}【解答】运行结果为:x=502.输入下面程序并运行。
main(){int a1,a2,x;a1=10;a2=20;x=a1*a2;printf(″a1=%d,a2=%d\n″,a1,a2);printf(″x=%d\n″,x);}【解答】运行结果为:a1=10,a2=20x=200三.编程题1.参照本章例题,编写一个C程序,用于显示如下信息:*************************I love C programs!*************************【分析与提示】①要有文件包含语句#include <stdio.h>。
C语言中没有数据的输入、输出等功能,数据的输入、输出都是通过调用系统提供的库函数scanf和printf等来实现的。
这些函数的说明都包括在stdio.h文件中。
②main是主函数的名称。
第六章 指针2
6.2
6.2
指针与数组
定义一个指向数组元素的指针变量的方 法,与以前介绍的指向变量的指针变量相同。 例如: int a[10]; int *p; p=&a[0]; p=a; C语言规定数组名代表数组的首地 址,也就是第0号元素的地址。
6.2
指针与数组
2. 一维数组元素的引用 对于一维数组元素的引用有两种方法: 下标法和指针法。下标法采用a[i]的形式 引用数组中的元素;指针法采用 *(p+i)的形式引用数组中的元素。
6.1
指针变量
6.1.2 指针变量的定义 定义指针变量的一般形式为: 基本类型 *指针变量名; 如: int *p1; float *p2; char *p3; int *p4, a, b; 指针变量除了可以指向简单数据类型 的数据之外,还可以指向数组、指针变 量、函数或结构体变量等。
6.1
指针变量
6.2
指针与数组
在某些情况下,数组名和指针变量名 可以通用。但需要注意的是,指针变量可 以作为赋值表达式的赋值对象使用,可以 进行自增(减)等运算,可以指向数组中 的任意元素;而数组名虽然表示数组的起 始地址,但它是地址常量,它的值在程序 运行期间是固定不变的。
6.2
指针与数组
【例6-7】 采用指针法输出数组全部元素。 #include<stdio.h> int main( ) { int a[5], i; int *p; for(i = 0; i < 5; i++) { scanf(”%d”, &a[i]); } for(p = a; p < a + 5; p++) { printf(”%4d”, *p); } return 0; }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二)指针数组和指向指针的指针
1、指针数组的概念:一个数组中的元素均为指针类型,称为指针数组。
形式:存储类型类型名*数组名[数组长度]
2、指向指针的指针:二级指针的定义:char **p;
含义:表示指针变量p是指向一个字符指针变量(即指向字符型数据的指针变量)的。
三)指针数组作main函数的形参:
指向数组的指针变量
教学难点
指向二维数组的指针
课时安排
2
教学方法
讲授与演示法相结合
教
学
内
容
及
过
程
设
计
一、复习引导
上节课介绍了指针变量的定义及其赋值。一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组和数组元素(把数组起始地址或某一元素的地址放到一个指针变量中)。
二、讲授新课
所谓数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。
引用数组元素可以用下标法(如a[3]),也可以用指针法,即通过指向数组元素的指针找到所需的元素。使用指针法能使目标程序质量高(占内存少,运行速度快)。
一)指向一维数组的指针
定义形式:
int a[10];
int *p;
p=&a[0];或p=a;
第十章指针
课题
第十章变量的指针与指针变量
教学
目的
1、了解指针与地址的概念
2、掌握指针变量的定义、引用及指针变量作为参数
教材
分析
教学重点
指针变量的定义、引用及指针变量作为参数
教学难点
指针变量作为参数
课时安排
2
教学方法
讲授与演示法相结合
教
学
内
容
及
过
程
设
计
一、讲授新课
一)地址与指针的概念
二)变量的指针与指针变量
含义:把数组的首地址赋给指针变量p。
也即:int *p=&a[0];或int *p=a;
二)通过指针引用数组元素
按C的规定:如果指针变量p已指向数组中的一个元素,则p+1指向同一个数组中的下一个元素(而不是简单地加1)。
如果p的初值为&a[0],则:
p+ia+i&a[i],即指向a数组的第i个元素。
若有:int (*q)[4];
使q指向二维数组第0行的赋值语句是:q = a;或q=&a[0];
使q指向二维数组第i行的赋值语句是:q = a+i;或q=&a[i];
在此前提下:二维数组元素a[i][j]可以采用*(*q+j)引用。
若有:int *q;
使q指向二维数组第一行第一个元素的赋值语句是q = a[0];或q = *a;
*(p+i)*(a+i)a[i]。
指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价
引用数组元素时,可以用:
1、下标法,如:a[i]
2、指针法,如:*( a+i )或*( p+i )
其中,a是数组名,p是指向数组的指针
三)数组名作函数参数
用数组名作实参,在调用函数时是把数组的首地址传送给形参。即实参数组与形参数组共占同一段内存。
指针:就是地址,即内存单元的编号。
指针变量:用来存放另一变量的地址(即指针)的变量。
例如:int a=5, *p=&a;
printf ( “%d”, *p );
注意:运算符*和&的用法,指针变量的自加自减运算。
备注
安排上机练习
第十章指针
课题
第十章数组与指针
教学
目的
掌握指针与数组的知识
教材
分析
教学重点
三、课堂小结
本课介绍了指向数组的指针,主要是指向一维数组的指针。用指针变量p指向数组a,指针变量p可以++、--,表示指向数组的上一元素或下一元素。但C编译程序不作下标越界检查。使用指针既方便有灵活,但初学者容易搞错。还介绍了指针与二维数组,指向二维数组的指针有指向元素的指针和行指针,使用时应注意它们的区别。
(1)下标法:a[i][j]
(2)指针法:*(a[i]+j), *(*(a+i)+j)
2、二维数组与指针
(1)指向二维数组元素的指针变量(一级指针变量)
定义:二维数组元素类型*指针变量名;
使用过程与指向一维数组元素的指针变量基本相似,只是要注意数组越界情况。
(2)指向二维数组某一行的指针变量(二级指针变量)
1、字符串的表示形式
(1)用字符数组存放一个字符串。
(2)用字符指针指向一个字符串。
2、字符串指针作函数参数
3、字符指针变量和字符数组的讨论
(1)字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址,决不是将字符串放到字符指针变量中。
(2)赋值方式。对字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值;char str[14]; str=“I loveChina.”;
四)有关指针的数据类型和指针运算的小结
1、有关指针的数据类型的小结
见书中的表
2、指针运算小结
(1)指针变量加(减)一个整数例:p++、p--、p+i、p-=i等
(2)指针变量赋值
将一个变量地址赋给一个指针变量。p=&a; p1=p2;
(3)指针变量可以有空值,即该指针变量不指向任何变量。如: p=NULL;
三、布置作业
《C语言习题解答》同步练习
备注
上机练习
第十章指针
课题
第十章指针与函数、指针数组
教学
目的
1、了解指针与函数的概念
2、掌握指针数组,二级指针等知识
教材
分析
教学重点
掌握指针数组,二级指针等知识
教学难点
指针数组,二级指针
课时安排
2
教学方法
讲授与演示法相结合
教
学
内
容
及
过
程
设
计
一、复习引导
前面介绍了指针与维数组、指针与字符串,我们可以用指针变量指向整型变量、字符串、数组,变量
函数的地址:函数存储区域的首地址就是该函数的入口点,其函数名表示了入口地址。
1、函数指针变量的定义:存储类型数据类型(*函数指针名)( );
2、返回指针值的函数
一个函数可以带回一个整型值、字符值、实型值等,也可以带回指针型的数据,即地址。其概念与以前类似,只是带回的值的类型是指针类型而已。
如果有一个实参数组,想在函数中改变此数组的元素的值,实参与形参的对应关系有以下4种情况:
1、形参和实参都用数组名;
2、实参用数组名,形参用指针变量;
教
学
内
容
及
过
程
设
计
3、实参形参都用指针变量;
4、实参为指针变量,形参为数组名。
四)指向二维数组的指针和指针变量
1、二维数组的地址
int a[3][4];
(1)两个相关运算符:
1)&:取地址运算符。可以获取某个变量的地址
2)*:指针运算符,获取某个指针变量所值向的变量的值
3、指针变量作为函数参数
函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型,它的作用是将一个变量的地址传送到另一个函数中。
二、课堂小结
本课介绍了指针与地址的概念,指针变量的定义、引用及作为参数的使用。
对字符指针变量,可以采用下面方法赋值:
char *a; a= “I love China.”; /*赋给a的是串的首地址*/
(3)对字符指针变量赋初值:
char *a=“I love China.”;等价于char *a; a=“I loveChina.”;
而对数组的初始化:
char str[14]={“I love China.”};不等价于char str[14];
四、布置作业
《C语言习题解答》同步练习
备注
上机练习
第十章指针
课题
指针与字符串
教学
目的
在掌握指针与数组的知识基础上,掌握字符串的指针与指向字符串的指针变量
教材
分析
教学重点
指向字符串的指针变量
教学难点
用指针处理字符串
课时安排
2
教学方法
讲授与演示法相结合
教
学
内
容
及
过
程
设
计
一、讲授新课
一)字符串的指针和指向字符串的指针变量
一级指针:(二维数组某一个元素的指针)
a[i], *(a+i) , &a[i][0]都是元素a[i][0]的地址。
a[i]+j , *(a+i)+j , &a[i][j]都是元素a[i][j]的地址。
二级指针:(二维数组某一行的地址)
a+i , &a[i]是二维数组中第I行的地址(行号从0计算)
二维数组元素的引用:
变量的指针就是变量的地址。
指针变量是一种特殊类型的变量,它是用于专门存放地址的。
1、指针变量的定义
定义形式:基类型*指针变量名;
注意:
(1)指针变量前的“*”,表示改变量的类型为指针型变量,“*”后的才是指针变量名。
(2)在定义指针变量时必须指定基类型
2、指针变量的引用
指针变量只能存放地址,不要将一个整型量(或其他任何非地址类型的数据)赋值给一个指针变量。
定义形式:数组元素类型(*指针变量名)[常量表达式];