文档库 最新最全的文档下载
当前位置:文档库 › 第07章 地址和指针 03

第07章 地址和指针 03

第07章 地址和指针 03
第07章 地址和指针 03

第七章地址和指针 03

7.3 指针变量作为函数参数:

实参:在调用函数中使用

形参:在定义函数中使用

规则:单向值传递(即只能由实参传给形参,但是没有办法通过形参的改变来改变实参的值)

函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型;它的作用是将一个变量的地址传送到另一个函数中

【例7.4.1】题目同例7.2,即输入的两个整数按大小顺序输出,今用函数处理,而且用指针类型的数据作为参数#include

swap(int *p1,int *p2)

{

int temp;

temp=*p1;

*p1=*p2;

*p2=temp;

}

main()

{

int a,b;

int *pointer_1,*pointer_2;

scanf("%d,%d",&a,&b);

pointer_1=&a;

pointer_2=&b;

if(a

printf("\n%d,%d\n",a,b);

}

运行结果:输入5,9时

此处地址传递

附加:

值传递:整型、实型、字符型等

地址传递:双向传递(传的不是本身的数,而是传地址)

实参→形参(类型都是地址) 函数的实现是来交换地址里存的值

C++程序设计 第八章 指针和引用

C++程序设计 第8章指针和引用 在程序运行时变量和函数都存放在内存中,通过变量名来访问数据、通过函数名来调用函数都是直接访问方式。还有另一种间接访问方式就是用指针。指针的本质是内存地址。指针往往用于说明函数的形参,使实参能通过指针传递,以提高函数调用的效率。利用指针能动态地使用内存,以提高内存使用效率。指针也能用来表示数据关联,以构成复杂的数据结构。指针是C程序中最常见的类型。引用是C++扩展的新概念,主要用于函数形参和返回类型。本章将详细介绍指针和引用的概念及应用。 8.1 指针及指针变量 指针(pointer)的本质是内存地址。指针变量就是专门存储地址的一种变量。通过指针变量所存储的地址来访问数据是一种间接寻址方式。由于处理器的机器语言能支持间接寻址,所以使用指针可以达到较高的计算性能。 8.1.1 地址的概念 C++编译器对不同对象或变量按其数据类型分配合适大小的存储空间。例如为char或bool型变量分配1个字节(bytes)的存储空间,short分配2字节,int和float分配4个字节,为double型变量分配8个字节的存储空间。当程序执行时,代码和变量都加载到内存中。计算机内存被分成若干个存储单元,存储单元以字节为单位。每个存储单元都有一个固定的编号,这个编号就是内存地址。尽管一个变量可能占用多个字节空间,但都通过第一个字节的地址来访问。存放某个变量的第一个字节的地址就是该数据的首地址。 指针即内存单元的地址,而数据是内存单元中的内容(或值)。 假设在程序中说明了1个int型的变量a,其值为68。系统为变量a分配4字节的存储空间,设首地址为0X0065FDF4。通过地址0X0065FDF4就能找到变量a在内存中的存储单元,从而对变量a进行访问。0X0065FDF4就是变量a的指针。知道一个变量的地址和变量的类型就能对变量进行访问,就如同知道房间号就能找到房间,从而找到房间里的主人。 指针是一种特殊的数据类型。所有类型的变量,无论是基本类型、用户定义类型、还是这些类型的数组,在一次运行时都有确定的地址,因此它们都有指针。对于32位计算机,地址长度就是32位,因此一个指针需要4个字节,与整型int、浮点型float具有相同大小的长度。一个指针不仅有值,而且还要确定其类型,表示它能指向什么类型的数据,决定了通过它要取用多少字节作为该变量的值。

C语言第八章地址与指针

1文档来源为:从网络收集整理.word 版本可编辑. 第八章 地址和指针 第一节 变量的地址和指针 1、计算机的内存是以字节为单位的一片连续的存储空间,每一个字节都有一个编号,这个编号就成为内存地址。 2、程序中定义了一个变量,c 编译系统就会根据定义中变量的类型,为其分配一定字节数的内存空间: Short int 2 Int float 4 Double 8 char 1 指针 4 图8.1 变量在内存中所占字节的地址示意图 每个变量的地址就是指该变量所占存储单元的第一个字节的地址。 3、直接存取:程序中我们对变量进行存取操作,实际上也就是对某个地址的存储单元进行操作。这种直接按变量的地址存取变量值的方式。 4、在c 语言中,还可以定义一种特殊的变量,这种变量只 a 2001 p 3001 a b x 1012 1013 1015 1016 1201 1202 1203 1204 a

1文档来源为:从网络收集整理.word 版本可编辑. 是用来存放内存地址的。 图8.2 存放地址的指针变量示意图 通过变量p 间接得到变量a 的地址,然后再存取变量a 的值的方式称为“间接存取”方式,通常变量p 指向了变量a ,变量a 是变量p 所指向的对象。 5、用来存放指针地址的变量就称作“指针变量”。 6、“变量p 指向变量a ”的含义就是指针变量p 中存放了变量a 的地址。 7、在某些场合,指针是使运算得以进行的唯一途径。 第二节 指针的定义赋值 一、 指针变量的定义和指针变量的基本类型 1、 定义指针变量的一般形式如下: 类型名 *指针变量名1,*指针变量名2…… 说明:1)类型名是基本类型。 2)*是说明符。(而在调用的时候,代表的是存储单元中的值) 3)指针变量名是用户标识符。 例:1)int *pi,*pj; pi pj 只能存放整型变量的地址 int I,*pi;double *pj; 2)p 为一个指向指针的指针变量 2002 2002 1012 1013 p p

第八章 二级c语言

第八章变量的地址和指针 变量:整 int 4B 单精度 float 4B 双精度 double 8B 存储空间:随机存放 short int a,b; float c,d; a 2B b 2B c 4B d 4B 1012 1013 1018 1019 2010 2011 2012 2013 3033 3034 3035 3036 变量的地址:该变量所占存储单元的第一个字节的 地址 &a=1012 p a *定义一个指针变量用于存放地址 4039 1012 地址就是指针 1.指针变量:存放(指向)不同地址的指针 定义:类型说明 *变量名; int *p; (指向一个整型变量) float *f;

2.给指针变量赋值 (1)int a,*p; p=&a; /*将a变量的地址赋给指针p*/ (2)初始化赋值 int a,*p=&a; 3.赋值形式: (1)赋值运算 int a,*p; p=&a; 注意:p=1000; (错误) (2)初始化赋值 int a,*p=&a; (3)把一个指针变量的值送给相同类型的另一个指针变量 int a,*pa,*pb; pa=&a; pb=pa; /*两个指针同时指向a*/ (4)把数组的首地址,送给指针变量

(数组名就表示数组的首地址) int b[5],*p; p=b; 或者 p=&b[0] (也可以指在数组中间 p=&b[2]) (5)把字符串的首地址送给字符型的指针变量 char *p; p="abcdef"; (把字符串的首地址送给p) 4.指针变量的运算 &:取地址符号 *:取内容运算符(把指针所指变量内容取出来) 优先级相同 main() {int a,*p=&a; a=5; printf("%d\n",*p); printf("%d\n",p); printf("%d\n",&p);}

第八章地址和指针

第八章地址和指针 8.1变量的地址和指针 在程序中变量实际上代表了内存中的某个存储单元。那么C是怎样存取这些单元的数据内容的呢? 我们知道计算机的内存是以字节为单位的一片连续的存储空间,每个内存单元都有一个唯一的编号,我们将其称为“内存地址”。计算机对数据的存取操作都是依赖于内存地址进行的。因为计算机的内存空间是连续的,所以内存中的地址空间也是连续的,并且用二进制数据来表示,为了方便和直观,我们将用十进制数据进行描述。 若在程序中定义了一个变量,C编译系统就会自动根据变量的类型,为其分配一定字节数量的存储空间。如int型2个字节,float型4个字节,double型8个字节,char型1个字节等。此后,这个变量的内存地址也就唯一的确定了。 一般情况下,我们在程序中只要给出变量名,不需要知道每个变量在内存中的具体地址,变量与地址之间的联系由C编译系统来完成。程序中我们对变量进行存取操作,实际上就是对变量地址的存储单元进行操作。这种直接按照变量地址进行存取的操作方式称为“直接存取”方式。 在C语言中我们还可以定义一种特殊的变量,这种变量只是用于存放内存变量地址的。如:p93 图8.2 这种通过变量p间接得到变量a的地址,然后再存取变量a的值的方式称为“间接存取”的方式。这种用来存放地址的变量称为“指针变

量”或“指针”。 由此我们可以知道,在C语言中,地址是指变量在内存中的存放的位置,即存放该变量的内存单元的名字。而指针是指一个变量,在该变量中存放的是其指向的那个变量在内存存储单元的地址。也就是说,变量的地址就可以理解为指针。 在C语言中,指针被广泛使用,他可以使程序简洁并高效运行,但使用不当就会产生意料不到的严重后果。因此,正确使用和掌握指针是十分必要的。 8.2 指针变量的定义和基本类型 定义指针变量的形式: 类型名*指针变量名1,*指针变量名2,……; 例如: int *pi,*pj; float *i,*j,*k; double *l,*m,*n; char *c,*s; 在每个变量前面的星号*是一个指针说明符,用来说明该变量是指针类型。变量前面的星号*不可以省略。指针变量名前面的类型定义是说明指针指向的数据类型。 另外,我们还可以定义一个指向指针的指针变量。定义形式为: 类型名**指针变量名1,**指针变量名2,……;

计算机二级c语言第八章 指针习题

第八章指针 一、选择题 1、设有定义:int n1=0,n2,*p=&n2,*q=&n1;,以下赋值语句中与n2=n1;语句等价的是 A)*p=*q; B)p=q; C)*p=&n1; D)p=*q; 2、若有定义:int x=0, *p=&x;,则语句printf("%d\n",*p);的输出结果是 A)随机值 B)0 C)x的地址 D)p的地址 3、以下定义语句中正确的是 A)char a='A'b='B'; B)float a=b=10.0; C)int a=10,*b=&a; D)float *a,b=&a; 4、有以下程序 main() { int a=7,b=8,*p,*q,*r; p=&a;q=&b; r=p; p=q;q=r; printf("%d,%d,%d,%d\n",*p,*q,a,b); } 程序运行后的输出结果是 A)8,7,8,7 B)7,8,7,8 C)8,7,7,8 D)7,8,8,7 5、设有定义:int a,*pa=&a;以下scanf语句中能正确为变量a读入数据的是 A)scanf("%d",pa) ; B)scanf("%d",a) ; C)scanf("%d",&pa) ; D)scanf("%d",*pa) ; 6、设有定义:int n=0,*p=&n,**q=&p;则以下选项中,正确的赋值语句是 A)p=1; B)*q=2; C)q=p; D)*p=5; 7、有以下程序 void fun(char *a,char *b) { a=b; (*a)++; } main () { char c1='A', c2='a', *p1, *p2; p1=&c1; p2=&c2; fun(p1,p2); printf("%c%c\n",c1,c2); }程序运行后的输出结果是 A)Ab B)aa C)Aa D)Bb 8、有以下程序 #include main() { printf("%d\n", NULL); } 程序运行后的输出结果是 A)0 B)1 C)-1 D)NULL没定义,出错 9、已定义以下函数 fun(int *p) { return *p; } 该函数的返回值是 A)不确定的值 B)形参p中存放的值

第8章-指针练习题

指针思考题 一、填空题 【1】下面函数要求用来求出两个整数之和,并通过形参传回两数相加之和值,请填空。 int add( int x, int y, ) { =x+y;} 【2】若有定义: char ch; (1) 使指针p 可以指向变量ch的定义语句是。 (2) 使指针p指向变量ch的赋值语句是。 (3) 通过指针p给变量ch读入字符的scanf函数调用语句是。 (4) 通过指针p 给变量ch赋字符A的语句是。 (5) 通过指针p输出ch中字符的语句是。 (6) 在16位微机上,指针变量p在内存中所占字节数是,变量ch在内在所占字 节数是。 二、选择题 【3】若有说明:int i,j=7,*p=&i;则与i=j;等价的语句是()。 A.i=*p; B.*p=*&j; C.i=&j; D.i=**p; 【4】若有定义:int x,*pb;则正确的赋值表达式是()。 A.pb=&x B.pb=x C. *pb=&x D.*pb=*x 【5】对于类型相同的指针变量,不能进行的运算是()。 A.< B. = C. + D. – 【6】以下程序的输出结果是()。 A.23 B. 24 C. 25 D. 26 Void fun ( int *x) { printf(%d\n”,++*x); } main( ) { int a=25; fun (&a); } 【7】以下程序的输出结果是()。 A.6 B. 7 C. 8 D. 9 main() { int k=2,m=4,n=6; int *pk=&k,*pm=&m,*p; *(p=&n)=*pk*(*pm); printf("%d\n",n); } 【8】以下程序的输出结果是()。 A.100 B. 50 C. 101 D.200 main() { int *v,b; v=&b; b=100;

第8章 指针

第8章指针 1. 单项选择题 (1)指针 pstr所指字符串的长度为D。char *pstr="\t\"1234\\abcd\n" A.15 B.14 C.13 D.12 (2)若有定义int a[4][6];则能正确表示a数组中任一元素a[i][j](i,j 均在有效范围内)地址的表达式A。 A.&a[0][0]+6*i+j B.&a[0][0]+4*j+i C.&a[0][0]+4*i+j D.&a[0][0]+6*j+i (3)以下程序段的输出结果为D。 char astr[5]="1234"; char *pstr=astr; printf("%c",pstr[1]-'0'); A.1 B. 2 C. ASCII码值为 1 的字符 D. ASCII 码值为 2 的字符 (4)下述程序段的输出结果为D。 char astr[]="abcde"; char *pstr=&astr[5]; while(--pstr>=astr) putchar(*pstr); putchar('\n'); A. abc B. cba C. abcde D. edcba (5)若有定义 int a=1,*b,c;,以下不正确的是 A 。 A. b=a B. b=&a C. b=&a,c=*b D. c=a (6)以下程序段的运行结果为 C 。 intnum[]={1,2,3,4,5,6,7,8,9},*pnum=&num[2]; pnum++; ++pnum; printf("%d\n",*pnum); A. 3 B. 4 C. 5 D. 6 (7)以下程序段的运行结果为 B 。 char *pstr="My name is Tom"; int n=0;

第8章-指针

第八章 一、选择题。 8.1若有定义:int x,*pb;则正确的赋值表达式是()。 A) pb=&x B)pb=x C)*pb=&x D)*pb=*x 8.2 若有以下程序: #include main() { printf(“%d\n”,NUUL); } 程序的输出结果是()。 A)因变量无定义输出不定值B)0 C)-1 D)1 8.3若有以下程序: #include void sub(int x,int y,int *z) { *z = y-x;} main() { int a,b,c; sub(10,5,&a); sub(7,a,&b); sub(a,b,&c) printf(“%d,%d,%d\n”,a,b,c); } 程序的输出结果是()。 A)5,2,3 B)-5,-12,-7 C)-5,-12,-17 D)5,-2,-7 8.4若有以下程序: #include main() { int k=2,m=4,n=6,*pk=&k,*pm=&m,*p; *(p=&n) =*pk*(*pm); printf(“%d\n”,n); } 程序的输出结果是()。 A)4 B) 6 C) 8 D) 10 8.5若指针p已正确定义并指向如图8.8所示储存单元: a[0] a[1] a[2] a[3] a[4] p↑ 图8.8 指针p指向示意图 则执行语句*p++;后,*p的值是()。 A)20 B)30 C)21 D)31 8.6若指针p已正确定义并指向如图8.8所示存储单元,则表达式*++p的值是()。 A)20 B)30 C)21 D)31 8.7若指针p已正确定义并指向如图8.8所示存储单元,则表达式++*p的值是()。 A)20 B)30 C)21 D)31 8.8若有以下程序: #include void prtv(int *x)

C语言第八章 地址和指针

第八章 地址和指针 第一节 变量的地址和指针 1、计算机的内存是以字节为单位的一片连续的存储空间,每一个字节都有一个编号,这个编号就成为内存地址。 2、程序中定义了一个变量,c 编译系统就会根据定义中变量的类型,为其分配一定字节数的内存空间: Short int 2 Int float 4 Double 8 char 1 指针 4 图8.1 变量在内存中所占字节的地址示意图 每个变量的地址就是指该变量所占存储单元的第一个字节的地址。 3、直接存取:程序中我们对变量进行存取操作,实际上也 a 2001 p 3001 a b x 1012 1013 1015 1016 1201 1202 1203 1204

就是对某个地址的存储单元进行操作。这种直接按变量的地址存取变量值的方式。 4、在c 语言中,还可以定义一种特殊的变量,这种变量只是用来存放内存地址的。 图8.2 存放地址的指针变量示意图 通过变量p 间接得到变量a 的地址,然后再存取变量a 的值的方式称为“间接存取”方式,通常变量p 指向了变量a ,变量a 是变量p 所指向的对象。 5、用来存放指针地址的变量就称作“指针变量”。 6、“变量p 指向变量a ”的含义就是指针变量p 中存放了变量a 的地址。 7、在某些场合,指针是使运算得以进行的唯一途径。 第二节 指针的定义赋值 一、 指针变量的定义和指针变量的基本类型 1、 定义指针变量的一般形式如下: 类型名 *指针变量名1,*指针变量名2…… 说明:1)类型名是基本类型。 2)*是说明符。(而在调用的时候,代表的是存储单元中的值) 3)指针变量名是用户标识符。 2002 2002 1012 1013 p a p

变量的指针和指针变量的区别是什么

2变量的指针和指针变量的区别是什么。 答;一个变量的地址指出了变量的存储单元在内存中的具体位置,能对变量进行存取操作。这个变量的地址就是变量的指针。指针是一种具有特殊意义的整型数,指针不能存放在一般的整型变量中,必须存放在专门指针的变量中,这类变量就是指针变量。 3 一维数组元素的引用有哪些方式。 答;下标法、地址法、指针法 4 2维数组列地址有哪些计算方法。 答;1 根据数组元素所在的行计算出行地址,然后把行地址转换成行中首元素的地址,再根据数组元素所在的列计算数组元素的地址。 2 根据2维数组的数组元素在存储空间上按行连续存放的特点,每个数组元素的地址等于2维数组元素的首元素地址加上该数组元素相对于首元素位置的偏移量。 3把2维数组的每一行当作一个一维数组,用一维数组元素地址的计算方法计算相应的2维数组元素的地址。 第9章结构体与共用体 1 什么是链表。其中单向链表具有哪些特点。 答;链表是若干个同样类型的结构通过依次串接方式构成的一种动态数据结构。链表中的每一个结构体数据成为结点,链表可以分成单向链表和双向链表 单向链表的特点;1 链表中的结点数据可以改变的 2 结点占用的内存是动态分配内存和动态释放内存函数。 2 对单向链表的常用操作有哪些。 答;对单向链表的常用操作有建立、显示、插入,删除和查找。 3 什么是共用体。 答;共用体是一个集合体。它的各个成员的数据类型可以是不相同的,所有成员共享同一段存储空间,存储空间的大小取决存储单元最大的成员的数据类型。 4 指向结构体类型变量的指针变量引用形式有哪些。 答;有两种形式;【星号指针变量名】。成员名和指针变量名-大于号成员名。 第10章位运算及编译预处理 1 C提供的编译预处理功能有哪些。如何实现。 答;功能有三种;宏定义、文件包含和条件编译,分别用宏定义命令、文件包含命令、条件编译命令实现。 2 文件包含的基本功能是什么。 答;文件包含处理是一个源文件可以将另一个源文件的全部内容包含到本文件中来,作为本文件的一部分,这可以节省程序设计人员的重复劳动。 【3【在C语言中提供了几种什么样的位运算符。 答;-、小于小于、大于大于、 4 文件包含需要注意哪些问题 答;一个井include命令只能指定一个被包含文件,包含多个文件侧需多个井include命令;文件包含可以嵌套,即一个被包含文件中可以包含另一个被包含的文件;在井include命令中,文件名可以用双引号或尖括号括起来。 第11章文件 1 文件的结束标志有哪些。 答;每个文件都有一个结束标志。当文件的位置指针移到文件的结束标志处时,表示文件结束。如何测试文件是否结束,常有2种方法 1 ASCII码文件的结束标志用【-1】表示。

C语言程序设计(第3版)何钦铭 颜 晖 第8章 指针

第8章指针 【练习8-1】如果有定义”int m, n = 5, *p = &m;”与m = n等价的语句是 B 。A.m = *p; B. *p = *&n; C. m = &n; D. m = **p; 解答: A:p是指向m的指针变量,所以*p等价于m。即m=m。 B:&n是n的地址,*&n是n的值,即把n的值赋给p指向的值m。即m=n。 C:&n是n的地址。即把n的地址赋给m。 D:**p是指p指向的指针所指向的值,在此无意义。 故选B。 【练习8-2】调用函数求两个数的和与差:计算输入的两个数的和与差,要求自定义一个函数sum_diff(float op1,float op2, float *psum, float *pdiff),其中op1和op2是输入的两个数,*psum 和*pdiff 是计算得出的和与差。 解答: #include<> void sum_diff(float op1,float op2,float *psum,float *pdiff); int main(void) { float op1,op2,sum,diff; printf("Input op1 and op2: "); scanf("%f%f",&op1,&op2); sum_diff(op1,op2,&sum,&diff); printf("%f+%f=%f;%f-%f=%f \n",op1,op2,sum,op1,op2,diff); return 0; } void sum_diff(float op1,float op2,float *psum,float *pdiff) { *psum=op1+op2; *pdiff=op1-op2; } 【练习8-3】两个相同类型的指针变量能不能相加为什么 解答: 不能。因为指针变量是一种特殊的变量,指针变量的值存放的是所指向变量的地址,两个地址相加并不能保证结果为一个有效的地址值,因而在 C 语言中指针变量相加是非法的。 【练习8-4】根据表所示,这组数据的冒泡排序其实循环到第 6 遍(即n-2)时就已经排好序了,说明有时候并不一定需要n-1 次循环。请思考如何改进冒泡排序算法并编程实现(提示:当发现一遍循环后没有数据发生交换,说明已经排好序了)。 解答:

第八章 文 件

第八章文件 一、单项选择题 1.C语言中,文件由(A)。 A.字符(字节)序列组成B.记录组成 C.数据行组成D.数据块组成 2.若文件型指针fp中指向某文件的末尾,则函数feof(fp)的返回值是(C)。 A.0 B.-1 C.非零值D.NULL 3. 下列语句将输出(B) #include printf(“%d %d %d”, NULL,’\0’,EOF); A. 0 0 1 B. 0 0 –1 C. NULL EOF D. 1 0 EOF 4.下列语句中,将fp定义为文件型指针的是(B)。 A.FILE fp; B.FILE *fp;C.file fp; D.file *fp; 5. 定义FILE *fp; 则文件指针fp指向的是(D)。 A. 文件在磁盘上的读写位置 B. 文件在缓冲区上的读写位置 C. 整个磁盘文件 D. 文件类型结构体 6. 缓冲文件系统的缓冲区位于(C )。 A. 磁盘缓冲区中 B. 磁盘文件中 C. 内存数据区中 D. 程序中 7.以“只读”方式打开文本文件a:\aa.dat,下列语句中哪一个是正确的( D)。 A、fp=fopen(”a:\aa.dat”,”ab”); B、fp=fopen(”a:\aa.dat”,”a”); C、fp=fopen(”a:\aa.dat”,”wb”); D、fp=fopen(”a:\aa.dat”,”r”); 8. 以“追加”方式打开文本文件a:\aa.dat,下列语句中哪一个是正确的( B)。 A、fp=fopen(”a:\aa.dat”,”ab”); B、fp=fopen(”a:\aa.dat”,”a”); C、fp=fopen(”a:\aa.dat”,”r+”); D、fp=fopen(”a:\aa.dat”,”w”); 9. 如果二进制文件a.dat已存在,现要求写入全新的数据,应以什么方式打开(A)。 A. “w” B. “wb” C. “w+” D. “wb+” 10. 为读写建立一个新的文本文件a:\aa.dat,下列语句中哪一个是正确的( B)。 A、fp=fopen(”a:\aa.dat”,”ab”); B、fp=fopen(”a:\aa.dat”,”w+”); C、fp=fopen(”a:\aa.dat”,”wb”); D、fp=fopen(”a:\aa.dat”,”rb+”); 11.以读写方式打开一个已有的二进制文件filel,并且定义FILE *fp,下面fopen函数正确的调用方式是(B )。 A.fp=fopen (“file1”, ”r”) B.fp=fopen (“file1”, ”rb+”) C.fp=fopen (“file1”, ”rb”) D.fp=fopen (“file1”, ”w b+”) 12.标准库函数fputs (p1,p2)的功能是(C)。 A.从p1指向的文件中读一个字符串存入p2指向的内存 B.从p2指向的文件中读一个字符串存入p1指向的内存 C.从p1指向的内存中读一个字符串写到p2指向的文件中 D.从p2指向的内存中读一个字符串写到p1指向的文件中

第八章 指针

第八章指针 【本章要求】 1、指针的声明、定义方法以及通过指针变量引用存储单元中的内容 2、指针作为函数参数,地址传递情况下,函数实参的变化 3、用指针指向函数,并通过指针调用该函数 4、一维数组和字符串中元素地址的计算方法,以及通过指针引用这些元素 5、二维数组中元素的计算方法,以及通过指针数组引用其中元素的方法 6、通过命令行方式调用main函数 7、内存的动态分配和释放 8.1 指针的基本概念 如果在程序中定义了一个变量,在编译时就给这个变量分配内存单元。系统根据程序中定义的变量类型,分配一定长度的空间。内存区的每一个字节有—个编号,这就是“地址”,它相当于旅馆中的房间号。 在程序中一般是通过变量名来对内存单元进行存取操作的。程序经过编译以后己经将变量名转换为变量的地址,对变量值的存取都是通过地址进行的。 按变量地址存取变量值的方式称为“直接访问”方式。 还可以采用另一种称之为“间接访问”的方式,将变量i的地址存放在另一个变量中。按C 语言的规定,可以在程序中定义整型变量、实型变量、字符变量等,也可以定义这样一种特殊的变量,它是存放地址的。 假设我们定义了一个变量i_pointer,用来存放整型变量的地址,它被分配为3010、3011字节。可以通过下面语句将i的地址(2000)存放到i_pointer中。 i_pointer = &i; 这时,i_pointer的值就是2000,即变量i所占用单元的起始地址。要存取变量i的值,也可以采用间接方式;先找到存放“i的地址”的变量,从中取出i的地址(2000),然后到2000、2001字节取出i的值(3)。 所谓“指向”就是通过地址来体现的。i_pointer中的值为2000,它是变量i的地址,这样就在i_pointer和变量i之间建立起一种联系,即通过i_pointer能知道i的地址,从而找到变量i的内存单元。 在C语言中,将地址形象化地称为“指针”。意思是通过它能找到以它为地址的内存单元(例如根据地址2000就能找到变量i的存储单元,从而读取其中的值)。一个变量的地址称为该变量的“指针”。例如,地址2000是变量i的指针。如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”。指针变量的值(即指针变量中存放的值)是指针(地址)。 8.2 指针变量 变量的指针就是变量的地址。存放变量地址的变量是指针变量,用来指向另一个变量。为了表示指针变量和它所指向的变量之间的联系,在程序中用“*”符号表示“指向”。 - 93 -

变量的指针和指向变量的指针变量

1.变量的指针和指向变量的指针变量 读起来很拗口,说白了就是变量的地址和用来存放变量地址的地址变量。因为一个变量在编译的时候系统要为它分配一个地址,假如再用一个变量来存放这个地址,那么这个变量就叫做指向变量的指针变量,也就是用来存放变量地址的这么一个变量。所谓"指向"就是指存放××的地址,如指向变量的指针变量,"指向"就是指用来存放变量的地址,再如指向数组的指针变量,"指向"就是指存放数组的地址。只要理解了这个,指针也就不难了。另外,还有指向字符串的指针变量,指向函数的指针变量,指向指针的指针变量等。 1) 指针变量的定义 形式:类型标识符*标识符如:int *pointer; 要注意两点:*表示pointer是个指针变量,在用这个变量的时候不能写成*pointer,*pointer 是pointer指向的变量。一个指针变量只能指向同一个类型的变量。如上面 pointer只能指向int型变量。 2)指针变量的引用 两个有关的运算符: & 取地址运算符&a 就代表变量a的地址 * 指针运算符*a就代表变量a的值 2.数组的指针和指向数组的指针变量 数组的指针指数组的起始地址,数组元素的指针指数组元素的地址。 1)指向数组元素的指针变量的定义与赋值 定义和指向变量的指针变量定义相同,c规定数组名代表数组的首地址,即第一个数组元素地址。 2)通过指针引用数组元素 我们通常引用数组元素的形式是a,如果用指针可以这样引用,*(a+i),或定义一个指针变量p,将数组a的首地址赋给p,p=a;然后用*(p+i)引用。 注意:指针变量p指向数组a首地址,则p++指向数组a的下一元素地址,即a[1]的地址。 3)数组名作函数参数 形参数组和实参数组之间并不是值传递,而是共用同一段地址,所以在函数调用过程中如果形参的值发生变化,则实参的值也跟着变化。 4)指向多维数组的指针和指针变量

第八章:善于利用指针

南京信息工程大学滨江学院实验(实习)报告 实验(实习)名称指针实验(实习)日期 2011.12 指导教师宣文霞 专业实验班年级大一班次4 班姓名王雅婷学号 20112335052 Eg8-1: 输入两个整数,并使其从大到小输出,用指针变量实现数的比较。 (1)源程序: #include void main() { int *p1,*p2,*p,a,b; scanf("%d,%d",&a,&b); p1=&a; p2=&b; if(a void swap(int *p1, int *p2) { int p; p=*p1; *p1=*p2; *p2=p; } void main() { int a,b; int *p,*q; scanf("%d,%d",&a,&b); p=&a; q=&b;31 if(a

(3)结果输出: (4)如果将swap 函数修改为如下形式,分析如何调试和修改? void swap(int *p1, int *p2) { int *p; *p=*p1; *p1=*p2; *p2=*p; } Eg8-3:用指针法输入12 个数,然后按每行4 个数输出。 (1)算法分析:定义一个整型数组和一个整型指针,这样通过数组就可以静态分配内存空间,存储数据;然后将指针与数组相关,使指针指向与数组相同的首地址处,这样就可以通过指针或者数组都可以对存储空间加以操作。 (2)源程序: #include void main() { int j,k,a[12],*p ; p=a; //使指针p 指向与数组a 相同的首地址处 for(j=0;j<12;j++) scanf("%d",p++); //移动P 的位置,输入数据 p=a; //指针重定位 for(j=0;j<12;j++) { if(j%4==0) printf("\n"); //按每行4 个数输出 printf("%4d",*p++); } printf("\n"); } (3)输入数据:0 1 2 3 4 5 6 7 8 9 10 11

第八章 地址和指针

第八章 地址和指针 8.1 变量的地址和指针 a p 2001 一、概念 1、计算机内存是以字节为单位的一片连续的存储空间,每一个字节都有一个编号(称为内存地址) 2、若在程序中定义了一个变量,系统就会根据变量的类型为其分配一定字节数的内存空间,这样变量的内存地址也就确定了,即为该变量所在存储单元的第一个字节地址。 3、程序中对变量的存取操作实际是对某个地址的存储单元进行操作,这里的存取方式有两种: 1)直接存取:直接按变量的地址来存取变量值的方式 2)间接存取:通过一个间接变量p 来存放变量a 的地址,这样我们要存取a 先要找到p 的地址,从中找出a 的地址,然后再去访问由该地址所指向的存储单元。这里,我们把存放地址的变量p 称为指针变量。 4、 说”指针变量p 指向了变量a ”的含义是指:指针变量p 中存放了变量a 的地址。 5、在某些场合,指针是使运算得以进行的唯一途径。 10 03

二、给指针变量赋值 一个指针变量可以通过不同的方式获得一个确定的地址值,从而指向一个具体的对象。 1、通过求地址运算符(&)获得地址值 1)单目运算符&用来求出运算对象的地址,以此可以把一个变量的地址赋给指针变量。如: int k,*p,*q; p=&k; 即把变量k 的地址赋予了p, p k Array这时可以说p指向了k. 2) ①求地址运算符&只能应用于变量和数组元素,不能用于表达式、常量和register变量 ②&运算符必须放在运算对象的左边,而且运算对象的类型必须与指针变量的基类型相同 3)在调用scanf函数时,如果有q=&k;时,那么scanf(%d”,&k)和scanf(“%d”,q)是等价的。 2、通过指针变量获得地址值 1)可以通过赋值运算把一个指针变量中的地址值赋给另一个指针变量,从而使这两个指针指向同一地址,如 p=q; 2)当进行赋值运算时,赋值号两边的指针变量的基类型 必须相同。

第八章指针(一)测试答案

(一)选择题 1.已有定义int k=2;int * ptr1,* ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值语句是:() A.k=* ptr1+* ptr2; B. ptr2=k; C. ptr1=ptr2 D. k=* ptr1*(* ptr2); 2.变量的指针,其含义是指该变量的:() A.值 B. 地址 C. 名 D. 一个标志 3.如有以下定义int a=5;下面对(1),(2)两个语句的正确解释是: (1)int * p=&a;(2)* p=a; A.语句(1)和(2)中的含义相同,都表示给指针变量p赋值 B.(1)和(2)语句的执行结果,都是把变量a的地址值赋给指针变量p C.(1)在对p 进行说明的同时进行初始化,使p指向a (2)将变量a的值赋给指针变量p D. 1)在对p进行说明的同时进行初始化,使p指向a (2)将变量a的值赋于*p (二)、填空题 1.在C程序中,只能给指针变量赋①值和②值。 ①变量的地址②NULL 2.在C程序中,可以通过三种运算来移动指针,它们是:①、②、③。 ①对指针变量加一个整形常量②对指针变量减去一个整形常量③指针赋值 (三)、程序填空 1.请按题意在空格处填入合适内容,使得程序可以正确运行。 程序功能:输入a和b两个整数,按先大后小的顺序输出a和b。 #include void main() { int *p1,*p2,*p,a,b; scanf("%d,%d", (1) , (2) ); //输入a和b俩个整数 p1= (3) ; //指针变量赋值 p2=&b; p=NULL; if (a void main()

C程序设计 第八章 指针

一、概念题 1.下列定义的含义 (1)int *p[3]; (2)int (*p)[3]; (3)int *p(int); (4)int (*p)(int); (5)int **p; 2.语句int a,*p=&a;的含义是什么? 3.二维数组a[3][4],&a[i][j]表示_____________,a表示___________,a[0] 表示____________。 4.下列数组元素的指针法表示。 (1)num[3] (2)data[4][2] 写出下列数组元素的下标法表示。 (1)*(*(a+1)+2) (2)(*(a+3))[4] (3)*(a[2]+5) 二、判断题 1.若定义int i,*p; 使p指向i的赋值语句是*p=&i ( F )。 2.若定义int i=100,*p=&i;设为i分配的内存地址为200~201,则*p为100 ( T )。 3.若定义int a,b,*p1=&a,*p2=&b;使p2也指向a的赋值语句是p2=p1 ( T )。 4.设p是一个指针变量,则int a[6],*p;p=&a;使指针p指向数组a。( F )。 5.a是一维数组名,数组元素a[1]还可以写作“*(a++)”( F)。 6.p为指向字符串的指针变量,*p表示所指字符串的值( F)。 7.若定义int b[8], *p=b;则数组元素b[4]地址的引用为p+4 ( T )。 8.若定义int b[8], *p=b;则执行p++;后,p指向b[1](T )。 9.对于定义int a[10], *p=a+8;数组a的最后一个元素是p[1](T )。 三、单选题 1. 设int *p,i;以下正确地语句是()。 A. p=10; B. i=p; C. i=*p ; D. p=&i; 2. 设char s[10];*p=s;以下语句不正确的是()。 A. p=s+5; B. s=p+5; C.s[2]=p[4]; D. *p=s[0]; 3.若有下列定义:char c[3],*pc=c; 则对c数组元素地址的正确引用是()。 A. &c[3] B. pc+2 C. c++ D. &c 4. 已知:float f [ ]={1.0, 2.3 , 4.5}, *pf=f; 则以下哪项不能正确引用数组元素()。 A. *pf-- B. *(--pf) C. *(pf++) D. *(++pf)

【C语言】第八章-指针作业

第八天—指针课后作业 注意:本次课是面向所有想学和爱学的同学们,所以,希望大家能真真正正的在这里学到技能,这是我们安排的相应课后作业,希望大家认真完成,及时提交到QQ群里,QQ群号:344401117,加群请备注。不然我们不会通过哦,因为这个群也是服务于我们此次直播课的学生。最后,大家有任何的疑问和建议都可以在群里提出来哦,我们虚心倾听。也希望大家帮助我们扩散、宣传,我们希望让更多想学和爱学的同学们听见我们的声音。 指针小结: 1.指针是一个变量,它存储另一个对象的内存地址。 2.指针的声明由基本类型、星号(*)和变量名组成。 3.为指针赋值,赋值运算符右侧必须是一个地址。如果是普通变量,则需要在前面加一个 取地址运算符&;如果是另一个指针变量或者是一个数组,不需要加&运算符。 4.运算符*用于返回指针指向的内存地址中存储的值。 5.指针算术运算的含义是指针的移动,将指针执行加上或者减去一个整数值n的运算相当 于指针向前或向后移动n个数据单元。 6.指针可以执行比较相等的运算,用来判断两个指针是否指向同一个变量。 7.指向数组的指针,存储的是数组中元素的地址。数组data的第(i+1)个元素的地址可表示 为&data[i]或(data+i)。 课后作业 跟我选 1.()提供了直接操作内存地址的变量。 A.结构 B.指针 C.数组 D.变量 2.下面声明一个指向整型变量x的指针p的语句,正确的是()。 A.int *p,x; p = x; B.int *p,x; p = *x; C.int *p,x; p = &x; D.int *p,x; *p = &x;

3.已知: float y,*ptr_val; ptr_val = &y; 则与*ptr_val等同的是()。 A.*y B.ptr_val C.y D.&y 4.()运算符用于获取变量的地址。 A.* B.? C.= D.& 5.已知:int arr[] = {1,2,3,4},*p = arr; 下列对数组元素的地址值的引用中正确的是()。 A.++p B.*p C.&arr D.&arr[2] 6.已有定义int k = 2;int *ptr1,*ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值语句是()。 A.k = *ptr1 +*ptr2 B.ptr2 = k C.ptr1 = ptr2 D.k = *ptr1 *(*ptr2) 7.若有定义:int a[5];则a数组中首元素的地址可以表示()。 A.&a B.a+1 C.k = *ptr1 +*ptr2 D.k = *ptr1 +*ptr2 跟我练 1.使用指针交换两个数的值。 2.定义3个整数及整数指针,仅用指针方法按由小到大的顺序输出。 3.输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一数对换。 4.编程输入一行字符,运用指针找出其中的大写字母,空格,数字,及其他字符的个数。

相关文档
相关文档 最新文档