|
C/C++语言程序设计辅导资料十一
一、主题:指针二、学习时间:2020年12月7日-12月13日“不忘初心、牢记使命”主题理论学习:
信仰、信念、信心,任何时候都至关重要。小到一个人、一个集体,大到一个政党、一个民族、一个国家,只要有信仰、信念、信心,就会愈挫愈奋、愈战愈勇,否则就会不战自败、不打自垮。无论过去、现在还是将来,对马克思主义的信仰,对中国特色社会主义的信念,对实现中华民族伟大复兴中国梦的信心,都是指引和支撑中国人民站起来、富起来、强起来的强大精神力量。
摘选自《在庆祝改革开放40周年大会上的讲话》
习近平《论全面深化改革》三、知识脉络:
第8章 指针
8.0 导学
8.1 指针与变量
8.2 指针与数组四、学习要求:
理解地址的概念
理解指针的作用
了解指针的指向
理解变量的地址
掌握指针变量的定义与初始化
掌握指针变量的引用
理解指针变量的特点
掌握指针指向一维数组
掌握指针访问数组的方法
了解指针指向二维数组
了解指针数组的作用五、重点难点:
指针变量
变量的指针
指向数组的指针六、主要内容:
1.理解指针
内存的概念
内部存储器( Memeory )是由存储单元组成的。
它的特点是存储单元是线性连续的。
存储单元的最小单位是字节Byte。
地址的概念
为了访问内存中的某个存储单元要为它编号,这种编号称为内存地址Address。
通过地址就能够访问该地址所标识的存储单元。
指针的指向
指向变量
指向数组
指向字符串2.指针与变量
变量的地址
编译系统就为定义的变量分配相应的内存单元;
不同类型的变量,所占的内存单元数也不相同;
变量在内存中总占用几个连续的字节,起始字节的地址,就是变量的地址;
一个变量的地址称为该变量的“指针”。
如果有一个变量专门用来存放另一变量的地址(即指针)则它称为“指针变量”。
指针的定义
类型说明符,指针所指向的数据类型。
指针类型说明符* ,表示这是个指针变量。
变量名,指针变量的名称。
指针的引用
取地址运算符 & i_pointer = & i ;
指针运算符 * *i_pointer 指针变量指向的变量的值
指针变量的使用
*的不同作用:在指针定义中,称为指针定义符, 表示该变量的类型为指针型变量。在可执行语句中的指针之前,称为指针运算符,可获得由该指针指向的变量内容
在定义指针变量时必须指定类型不能指向其他类型
指针变量的赋值:可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向一个该变量。
指针的初始化
指针变量可以初始化为0、NULL或一个地址。
空指针: 数值为0或NULL的指针不指任何内容。
指针变量中只能存放地址(指针),不要将一个数赋给一个指针变量。
在引用指针变量时,可能有三种情况:
int a, *p=NULL;
给指针变量赋值 p = &a;
引用指针变量的值 printf(“%p %x”, p, p);
引用指针变量指向的变量 printf(“%d %d”,*p, a);3.指针与数组
一个数组包含若干元素,每个数组元素都在内存中占用存储单元,
它们都有相应的地址。
所谓数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。
对数组元素也可以采用指针进行访问,效率相对更高。4.指针与一维数组
一个数组是由连续的一块内存单元组成的。
数组名就是这块连续内存单元的首地址(常量)。
指针的加减运算是以数据类型为单位展开的,即指针移动n个单位,则:移动的实际字节数= n*sizeof(指针的类型)
例:指针与整数相加减
float f[4];
float *fp = f ;
fp = f + 3; // fp = &f[3]
fp = fp- 2; //fp = &f[1]
int a[3], *p=0;
使用数组名指向数组中第一个元素的指针:
p = a ; p = & a[0] ;
可以将指针像数组一样建立下标:
p[ i ] a [ i ]
可用指针和数组名访问i+1个元素:
a [ i ] *(p+i) *(a+i) p[i]
数组i+1个元素的地址:
& a[i] p + i a + i & p[i]5.指针数组
一个数组的元素值为指针,则该数组称为指针数组。
指针数组所有元素都必须是指向相同数据类型的指针。
指针数组定义的一般形式为: 类型说明符 *数组名[数组长度];
int x, a[5];
int* pa[3] ;
pa[0] = &x;
pa[1] = &a[2];
pa[2] = a;七、习题:
1.变量的指针,其含义是指该变量的_________。
A.值
B.地址
C.名
D.一个标志
答案:B2.若有语句int *point,a=4;和point=&a;下面均代表地址的一组选项是_____。
A.a, point,*&a
B.&*a, &a, *point
C.*&point, *point, &a
D.&a, &*point , point
答案:D3.若有说明 int m=5,n,*p;以下正确的程序段的是________。
A.p=&n; scanf("%d",&p);
B.p=&n; scanf("%d",*p);
C.*p=n; scanf("%d",&n);
D.p=&n; *p=m;
答案:D4.以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是________。
main()
{
int *p,*q,a,b;
p=&a;
printf(“input a:”);
scanf(“%d”,*p);
……
}
A.*p表示的是指针变量p的地址
B.*p表示的是变量a的值,而不是变量a的地址
C.*p表示的是指针变量p的值
D.*p只能用来说明p是一个指针变量
答案:B5.已有变量定义和函数调用语句:int a=25;print_value(&a);下面函数的正确输出结果是________。
void print_value(int *x)
{ printf(“%d\n”,++*x);}
A.23
B.24
C.25
D.26
答案:D6.若有说明:long *p,a;则不能通过scanf语句正确给输入项读入数据的程序段是________。
A.*p=&a; scanf("%ld",p);
B.p=(long *)malloc(8); scanf("%ld",p);
C.scanf("%ld",p=&a);
D.scanf("%ld",&a);
答案:A7.有以下程序
#include<stdio.h>
main()
{ int m=1,n=2,*p=&m,*q=&n,*r;
r=p;p=q;q=r;
printf("%d,%d,%d,%d\n",m,n,*p,*q);
}
程序运行后的输出结果是
A.1,2,1,2
B.1,2,2,1
C.2,1,2,1
D.2,1,1,2
答案:B8.有以下程序
main()
{ int a=1, b=3, c=5;
int *p1=&a, *p2=&b, *p=&c;
*p =*p1*(*p2);
printf("%d\n",c);
}
执行后的输出结果是
A.1
B.2
C.3
D.4
答案:C9.有以下程序
int a, k=4,m=4, *p1=&k,*p2=&m;
a=p1!=p2;
程序运行后的输出结果是()
A.4
B.1
C.0
D.运行时出错,无定值
答案:B10.在16位编译系统上,若有定义int a[]={10,20,30}, *p=&a;,当执行p++;后,下列说法错误的是()。
A.p向高地址移了一个字节
B.p向高地址移了一个存储单元
C.p向高地址移了两个字节
D.p与a+1等价
答案:A11.有以下程序段
int a[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3],b;
b=p[5];
b中的值是()
A.5
B.6
C.8
D.9
答案:D12.若有以下定义,则对a数组元素的正确引用是_________。
int a[5],*p=a;
A.*&a[5]
B.a+2
C.*(p+5)
D.*(a+2)
答案:D13.若有以下定义,则p+5表示_______。
int a[10],*p=a;
A.元素a[5]的地址
B.元素a[5]的值
C.元素a[6]的地址
D.元素a[6]的值
答案:A14.设已有定义:int a[10]={15,12,7,31,47,20,16,28,13,19},*p; 下列语句中正确的是()。
A.for(p=a;a<(p+10);a++);
B.for(p=a;p<(a+10);p++);
C.for(p=a,a=a+10;p<a;p++);
D.for(p=a;a<p+10; ++a);
答案:B15.有以下程序段
#include <stdio.h>
int main()
{ int x[] = {10, 20, 30};
int *px = x;
printf("%d,", ++*px); printf("%d,", *px);
px = x;
printf("%d,", (*px)++); printf("%d,", *px);
px = x;
printf("%d,", *px++); printf("%d,", *px);
px = x;
printf("%d,", *++px); printf("%d\n", *px);
return 0;
}
程序运行后的输出结果是( )
A.11,11,11,12,12,20,20,20
B.20,10,11,10,11,10,11,10
C.11,11,11,12,12,13,20,20
D.20,10,11,20,11,12,20,20
答案:A16.设有如下定义:
int arr[]={6,7,8,9,10};
int *ptr;
ptr=arr;
*(ptr+2)+=2;
printf ("%d,%d\n",*ptr,*(ptr+2));
则程序段的输出结果为
A.8,10
B.6,8
C.7,9
D.6,10
答案:D17.若有定义:int a[]={2,4,6,8,10,12},*p=a;则*(p+1)的值是______。 *(a+5)的值是_________。
答案:(4,12)18.若有以下说明和语句,int c[4][5],(*p)[5]; p=c;能正确引用c数组元素的是______。
A. p+1
B.*(p+3)
C.*(p+1)+3
D.*(p[0]+2)
答案:D19.若有定义:int a[2][3],则对a数组的i行j列元素地址的正确引用为______。
A.*(a[i]+j)
B.(a+i)
C.*(a+j)
D.a[i]+j
E.*(a+i) + j
答案:D20.若有以下定义:int a[2][3]={2,4,6,8,10,12};则a[1][0]的值是_____。*(*(a+1)+0)的值是________。
答案:(8,8)
本内容由易百教育整理发布
网址www.openhelp100.com
QQ 515224986
|
|