下列对变量的引用中错误的是____。
int a; int &p = a;
char a; char &p = a;
int a; int &p; p=a;
float a; float &p = a;
若有说明:int n=2,*p=&n,*q=p,则以下非法的赋值语句是: ( )。
p=q
*p=*q
n=*q
p=n
变量的指针是指变量的( )。
值
地址
名
内存单元
若有语句“int i , j=7 , *p=&i; ”,则与“i=j; ”等价的语句是( )。
i=*p;
*p=j
i=&j;
i=**p;
在int a=3, *p=&a;中,*p的值是( ) 。
&a
无意义
&p
3
下列语句定义x为指向int类型变量a的指针,正确的是( )。
int a,*x=a
int a,*x=&a
int *x=&a,a
int a,x=a
若变量已正确定义并且指针p已经指向某个变量x,则(*p)++相当于____。
p++
x++
*(p++)
&x++
若p1、p2都是整型指针,p1已经指向变量x,要使p2也指向x, ____是正确的。
p2=p1
p2=**p1
p2=&p1
p2=*p1
根据声明int a[10], *p=a; ,下列表达式错误的是( )。
a[9]
p[5]
a++
*p++
下列关于引用的说法,错误的是____。
引用在定义时必须初始化
引用在初始化时不能绑定常量值
引用初始化后,可以通过更变来引用其他变量
数组不能定义引用
若定义pf为指向float类型变量f的指针,下列语句中__是正确的。
float f, *pf = f;
float f, *pf = &f;
float *pf = &f, f;
float f, *pf =0.0;
( )是给变量取一个别名,引入了变量的同义词。
枚举
指针
引用
结构
已知:float b = 34.5; ,则下列表示引用的方法中,正确的是( )。
float &x = b;
float &y = 34.5;
float &z;
int &t = &b;
若有说明:int *p,m=5,n;以下正确的程序段是( )。
p=&n;
scanf("%d",&p);
p=&n;
scanf("%d",*p);
scanf("%d",&n);
*p=n;
p=&n;
*p=m;
设有定义int a=3, b, *p=&a;,则下列语句表达有错的是
b = *&a;
b = *a;
b = *p;
b = a;
如果已经定义int x;,则对指针变量pointer进行说明和初始化正确的是
int pointer = &x;
int *pointer = *x;
int pointer = x;
int *pointer = &x;
下列不正确的定义是( )。
int *p=&i,i;
int *p,i;
int i,*p=&i;
int i,*p;
小可爱们,咱们来做一个简单的计算器:输入两个整数,输出它们的和。
#include
int main()
{
int a,b;
scanf("%d%d",(2分)); //输入a,b
printf("%d\n",(2分));//输出和
return 0;
}
小可爱们,这次使用scanf函数输入时,有没有忘记在变量前面加&符号?
为什么使用scanf函数变量前面要加&,printf函数变量前面不加&,这个&符号是什么作用呢?
咱们先看下面图片中编译器的输出。

小伙伴们,你发现了么?变量其实同时有地址和值两个属性,它的数据值,存储在某个内存地址中,这个值被称为变量的右值。我们也可认为右值的意思是被读取的值。它的地址值,即存储数据值的那块内存的地址,被称为变量的左值。
我们一般用一个变量,都是直接写一个名字,其实如果这个名字在赋值号右边,就是代表右值,也就是变量的值,如果在赋值号左边,就是代表左值,即代表变量的地址,写出来一样,意义是不一样的,编译器自动帮我们选择了正确的意义。
回到我们第一个问题:为什么使用scanf函数变量前面要加&,printf函数变量前面不加&?
因为scanf要变量里写入数值,所以它必须知道那个变量的地址,至于变量里存的是什么值,它是不关心的,反正写入之后就被覆盖成新的值了。
对比printf,是要输出变量里的数值,它只管要那个值,至于地址在哪,它也无所谓。
而变量名字写在函数参数里面时,和写在赋值号右边一样,也是代表值,可是像scanf这种函数,它确实需要地址,编译器只认为在赋值符左边的才是左值,那在scanf函数里,没法自动获得左值,这时就需要我们手动加一个取地址运算符&,明确告诉编译器去获取变量的地址给这scanf来用。
再仔细看看上面的图片,我们会发现这里的&a是int ∗*∗类型,a是int类型。&其实是取地址运算符,&a得到的就是变量a分配的内存地址。&a表达式的值是地址,所以咱们在编译器里看到&a是int ∗*∗类型,即指针类型。
类似的,我们可以使用下面语句定义一个指针变量:
int *p;
和普通变量不同,指针变量赋值必须指向一个已经分配的内存地址,例如:
int a = 2;
int *p = &a;
我们定义了一个变量a,其值为2。我们又定义了一个指针变量p(这里的∗*∗是指针变量定义符号),将其初始化为变量a的地址。
如果我们想使用指针变量p来修改变量a的值要怎么做呢?使用指针运算符,如下:
*p = 3;
这里的∗*∗是运算符。因为p是a的地址(p指向变量a),∗*∗p就是访问p指向的对象,∗*∗p赋值为3,就是a赋值为3。
请完善程序,实现以下程序功能:从键盘上输入两个整数,通过指针将两个数按照升序排序,最后输出结果。
输入样例1:
-99 99
输出样例1:
-99 99
输入样例2:
99 -99
输出样例2:
-99 99
#include
int main(void)
{int k;for(k=1;k<=3;k++){ //该循环用于自动阅卷,请考生忽略
int i,j,(2分),t;
p=(2分); //使得p指向变量i
q=(2分); //使得q指向变量j
scanf("%d%d",p,q); //输入两个整数,存入变量i、j中
if(*p(2分)*q) //比较变量i、j的值
{ t=*p;
(2分)
*q=t;
}
printf("%d %d\n",i,j);
} //该循环用于自动阅卷,请考生忽略
return 0;
}
请完善程序,实现以下程序功能:从键盘上输入3个整数,使用指针实现升序排序,最后输出结果。
输入样例1:
1 -6 99
输出样例1:
-6 1 99
输入样例2:
99 1 -6
输出样例2:
-6 1 99
输入样例3:
-6 99 1
输出样例3:
-6 1 99
//本程序的基本算法:首先将3个数中最小的数存放在变量a中;然后,将次最小数存放在变量b中;
//变量c中存放的自然是最大数;至此,3个数按由小到大的顺序排好。
#include
int main(void)
{int k;for(k=1;k<=6;k++){ //该循环用于自动阅卷,请考生忽略
int a,b,c,*p,*q,*r,t;
//指针变量p,q,r分别指向变量a,b,c
p=&a;
q=&b;
r=(2分);
scanf(“%d%d%d”,p,q,r); //输入3个整数存入变量a,b,c中
if(*p>*q) //将变量a,b中较小的数存放在a中
{t=*p;
(2分);
*q=t;
}
if((2分)) //将变量a,c中较小的数存放在a中
{t=*p;
*p=*r;
*r=t;
}
if(*q>*r) //将变量b,c中较小的数存放在b中
{(2分);
*q=*r;
*r=t;
}
printf(“%d %d %d\n”,*p,(2分),*r); //输出排好序的3个数
} //该循环用于自动阅卷,请考生忽略
return 0;
}
请完善程序,实现以下程序功能:从键盘上输入4个整数,通过间接引用方式找出其中的最小数并输出。
输入样例1:
-999 5 8 2
输出样例1:
min=-999
输入样例2:
8 5 -999 2
输出样例2:
min=-999
输入样例3:
8 2 5 -999
输出样例3:
min=-999
//本程序基本算法:首先假设变量a的值最小,将其保存到变量min中
//然后,将变量b,c,d的值依次与min进行比较
//将较小的值赋给min
//比较3次后,得到4个数中的最小数min
#include
int main(void)
{int k;for(k=1;k<=4;k++){ //该循环用于自动阅卷,请考生忽略
int a,b,c,d,*p1,*p2,*p3,*p4,min;
//使得指针变量p1,p2,p3,p4分别指向变量a,b,c,d
p1=&a;
p2=(2分);
p3=&c;
p4=(2分);
scanf("%d%d%d%d",p1,p2,(2分)); //输入4个整数,并依次存入变量a,b,c,d中
min=*p1; //将变量a的值赋给min
if((2分)) //将变量b的值与min的值进行比较
min=*p2;
if(*p3 请完善程序,实现以下程序功能:已知斐波那契数列的前两项均为1,从第3项开始,每一项的值为其前面两项之和。下面程序的功能为使用指针依次计算出斐波那契数列的前20项并保存到数组a中,然后再顺序输出。
输出样例:
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
#include
int main(void)
{int f[20],i,*p1,*p2,*p3;
f[0]=1;
(2分); //第2项赋值
//在下面的循环中,指针p1,p2,p3依次存储f[i-2],f[i-1],f[i]的地址
for(i=2;(2分);i++)
{p1=&f[i-2];
p2=(2分); //使得p2指向相应的数组元素
p3=&f[i];
*p3=(2分); //求出下一项的值
}
p1=f;//指针p1存储数组f的首地址
for(i=0;i<=19;i++) //依次输出数列的前20项
{printf("%d ",*p1);
(2分); //调整指针变量p1的值,指向下一个数组元素
}
return 0;
}
编写程序,从键盘上输入任意两个整数,输出它们的和值与差值之积(用指针实现)。
#include
int main()
{
int a,b,s;
int *pa=&a,*pb=&b,*ps=&s;
scanf("%d%d",(3分));
*ps=(*pa + *pb)*(*pa - *pb);
printf("(3分)\n",(4分) );
return 0;
}
编写程序,输入一个数字字符,将其转化为数字并输出(用指针实现)。
#include
int main()
{
char c,*pc;
int d,*pd;
pc=(2分);
pd=(2分);
*pc=getchar(); //输入数字字符
*pd=(4分); //转化为数字
printf("%d\n",(2分) ); //输出数字
return 0;
}