‘壹’ C语言 指针方法
#include<stdio.h>
int main()
{
int a,b,c,s[3],t;
int *x,*y,*z;//定义指针变量
x=&a;//将a的地址赋给指针x,下同
y=&b;
z=&c;
scanf("%d%d%d",x,y,z);
s[0]=*x;//将指针x所指向的变量值赋给数组s的第一个元素;依次类推
s[1]=*y;
s[2]=*z;
for(int i=0;i<3;i++)//冒泡排序
for(int j=0;j<3-i-1;j++)
if(s[j]<s[j+1])
{
t=s[j];
s[j]=s[j+1];
s[j+1]=t;
}
for(int i=0;i<3;i++)
printf("%d ",s[i]);
return 0;
}
‘贰’ C++指针训练,谁帮我做一下
(一) 填空题
1. 一个指针类型的对象占用内存的______个字节的存储空间.
2. 一个指针类型指向一个数据对象,它保存着该数据对象的______,若数据对象为DataType类型,则该指针的类型为__________.
3. 若要把一个整形指针P转换为字符指针,则采用的强制转换表达式为__________.
4. 假定一个数据对象为int *类型,则采用的强制转换表达式为________.
5. 假定P是一个指向整数对象的指针,则用___________表示该整数对象,用_________表示指针变量P的地址.
6. 假定P是一个指针,则*P++运算首先访问____________,然后使_______的值增1.
7. 假定P是一个指针,则(*P)++运算首先访问_____________,然后使_________的值增1.
8. 假定P所指对象的值为25,P+1所指对象的值为42,则*P++的值为________.
9. 假定P所指对象的值为25,P+1所指对象的指为42,则*++P的值为________.
10. 假定P所指对象的值为25,P+1所指对象的值为42,则执行(*P)++运算后,P所指对象的值为_______.
11. 假定P所指对象的值为25,P+1所指对象的值为42,则执行*(P++)或*P++运算后,P所指对象的值为________.
12. 假定A是一个一维数组,则A[i]的指针访问方式为________.
13. 一个数组的数组名实际上是指向该数组__________元素的指针,并且在任何时候都不允许_______它.
14. 若要定义整形指针P并初始指向X,则所使用的定义语句为_______________.
15. 若P指向X,则______与X的表示是等价的.
16. 在一个二维数组int a[m][n]中,包含的一维元素a[i]的类型为________,访问a[i]时返回值的类型为_______.
17. 假定a是一个二维数组,则a[i][j]的指针访问方式为_____________.
18. 若y是x的引用,则&y和&x的值______,即为变量______的地址.
19. 招待int *p=new int[10]操作,使p指向动态分配的数组中下标为________的元素,该元素可表示为_______或_________.
20. 执行char *p=new char(‘a’)操作后,p所指向的数据对象的值为_________.
21. 执行__________操作将释放由P所指向的动态分配的数据空间.
22. 执行__________操作将释放由P所指向的动态分配的数组空间.
__________________________
答案是:
1, 4
2, 起始地址,DataType*
3, (char*)P
4, (int*)
5, *P, &P
6, P指向的数据,P
7, P指向的数据,, P指向的数据
8, 25
9, 42
10, 26
11, 42
12, *(A+i)
13, 起始,修改
14, int *P = &X;
15, (*P)
16, int *, int[n]
17, *(*(a+i) + j)
18, 相同,x
19, 0, *p, p[0]
20, 'a'
21, delete
22, delete[]
‘叁’ 二维数组与指针、指针数组、数组指针的用法
二维数组和指针⑴ 用指针表示二维数组元素。
要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题。我们知道,一个二维数组在计算机中存储时,是按照先行后列的顺序依次存储的,当把每一行看作一个整体,即视为一个大的数组元素时,这个存储的二维数组也就变成了一个一维数组了。而每个大数组元素对应二维数组的一行,我们就称之为行数组元素,显然每个行数组元素都是一个一维数组
下面我们讨论指针和二维数组元素的对应关系,清楚了二者之间的关系,就能用指针处理二维数组了。
设p是指向二维数组a[m][n]的指针变量,则有:
int* p=a[0];//此时P是指向一维数组的指针。P++后,p指向 a[0][1]。
如果定义int (*p1)[n];p1=a;p1++后,p1指向a[1][0];
则p+j将指向a[0]数组中的元素a[0][j]。
由于a[0]、a[1]┅a[M-1]等各个行数组依次连续存储,则对于a数组中的任一元素a[i][j],指针的一般形式如下:
p+i N+j 相应的如果用p1来表示,则为 (p1+i)+j
元素a[i][j]相应的指针表示为:
( p+i N+j) 相应的如果用p1来表示,则为 ( (p1+i)+j)
同样,a[i][j]也可使用指针下标法表示,如下:
p[i N+j]
例如,有如下定义:
int a[3][4]={{10,20,30,40,},{50,60,70,80},{90,91,92,93}};
则数组a有3个元素,分别为a[0]、a[1]、a[2]。而每个元素都是一个一维数组,各包含4个元素,如a[1]的4个元素是a[1][0]、a[1][1]、a[1]2]、a[1][3]。
若有:
int p=a[0];
则数组a的元素a[1][2]对应的指针为:p+1 4+2
元素a[1][2]也就可以表示为:( p+1 4+2)
用下标表示法,a[1][2]表示为:p[1 4+2]
特别说明:
对上述二维数组a,虽然a[0]、a都是数组首地址,但二者指向的对象不同,a[0]是一维数组的名字,它指向的是a[0]数组的首元素,对其进行“ ”运算,得到的是一个数组元素值,即a[0]数组首元素值,因此, a[0]与a[0][0]是同一个值;而a是一个二维数组的名字,它指向的是它所属元素的首元素,它的每一个元素都是一个行数组,因此,它的指针移动单位是“行”,所以a+i指向的是第i个行数组,即指向a[i]。对a进行“ ”运算,得到的是一维数组a[0]的首地址,即 a与a[0]是同一个值。当用int p;定义指针p时,p的指向是一个int型数据,而不是一个地址,因此,用a[0]对p赋值是正确的,而用a对p赋值是错误的。这一点请读者务必注意。
⑵ 用二维数组名作地址表示数组元素。
另外,由上述说明,我们还可以得到二维数组元素的一种表示方法:
对于二维数组a,其a[0]数组由a指向,a[1]数组则由a+1指向,a[2]数组由a+2指向,以此类推。因此, a与a[0]等价、 (a+1)与a[1]等价、 (a+2)与a[2]等价,┅,即对于a[i]数组,由*(a+i)指向。由此,对于数组元素a[i][j],用数组名a的表示形式为:
( (a+i)+j)
指向该元素的指针为:
*(a+i)+j
数组名虽然是数组的地址,但它和指向数组的指针变量不完全相同。
第一,指针变量的值可以改变,即它可以随时指向不同的数组或同类型变量,而数组名自它定义时起就确定下来,不能通过赋值的方式使该数组名指向另外一个数组。
第二,数组名是指针,类型是指向元素类型的指针,但值是指针常量,声明数组时编译器会为声明所指定的元素数量保留内存空间。数组指针是指向数组的指针,声明指针变量时编译器只为指针本身保留内存空间。
例4 求二维数组元素的最大值。
该问题只需对数组元素遍历,即可求解。因此,可以通过顺序移动数组指针的方法实现。
main()
{
int a[3][4]={{3,17,8,11},{66,7,8,19},{12,88,7,16}};
int p,max;
for(p=a[0],max= p;p<a[0]+12;p++)
if( p>max)
max= p;
printf("MAX=%d/n",max);
}
执行结果:
MAX=88
这个程序的主要算法都是在for语句中实现的:p是一个int型指针变量;p=a[0]是置数组的首元素地址为指针初值;max= p将数组的首元素值a[0][0]作为最大值初值;p<a[0]+12是将指针的变化范围限制在12个元素的位置内;p++使得每比较一个元素后,指针后移一个元素位置。
例5 求二维数组元素的最大值,并确定最大值元素所在的行和列。
本例较之上例有更进一步的要求,需要在比较的过程中,把较大值元素的位置记录下来,显然仅用上述指针移动方法是不行的,需要使用能提供行列数据的指针表示方法。
main()
{
int a[3][4]={{3,17,8,11},{66,7,8,19},{12,88,7,16}};
int p=a[0],max,i,j,row,col;
max=a[0][0];
row=col=0;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if( (p+i4+j)>max)
{
max= (p+i 4+j);
row=i;
col=j;
}
printf("a[%d][%d]=%d/n",row,col,max);
}
程序运行结果:
a[2][1]=88
⑶ 行数组指针
在上面的说明中我们已经知道,二维数组名是指向行的,它不能对如下说明的指针变量p直接赋值:
int a[3][4]={{10,11,12,13},{20,21,22,23},{30,31,32,33}}, p;
其原因就是p与a的对象性质不同,或者说二者不是同一级指针。C语言可以通过定义行数组指针的方法,使得一个指针变量与二维数组名具有相同的性质。行数组指针的定义方法如下:
数据类型 ( 指针变量名)[二维数组列数];
例如,对上述a数组,行数组指针定义如下:
int ( p)[4];
它表示,数组 p有4个int型元素,分别为( p)[0]、( p)[1]、( p)[2]、( p)[3] ,亦即p指向的是有4个int型元素的一维数组,即p为行指针
此时,可用如下方式对指针p赋值:
p=a;
(4)指针数组的定义
指针数组是指每个元素中存放的是指针。定义为 int *p[4];sizeof(p)=16,返回的是数组的总空间
‘肆’ 利用指针的方法,求数组中的最大数和最小数
代码如下:
#include "stdafx.h"
#include "stdio.h"
int u,v;
find_u_v (int *p,int n)
{
int *q;
u=v=*p;
for(q=p;q<p+n;q++)
{if(u<*q) u=*q;
else if(v>*q) v=*q;
}
}
int main(int argc, char* argv[])
{ int i,num[10];
printf("intput 10 numbers ");
for(i=0;i<10;i++)
scanf("%d",&num[i]);
find_u_v(num,10);
printf(" u=%d;v=%d ",u,v);
}
(4)指针综合训练方法扩展阅读
指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。
意思是通过它能找到以它为地址的内存单元。在高级语言中,指针有效地取代了在低级语言,如汇编语言与机器码,直接使用通用暂存器的地方,但它可能只适用于合法地址之中。指针参考了存储器中某个地址,通过被称为反参考指针的动作,可以取出在那个地址中存储的值。
作个比喻,假设将电脑存储器当成一本书,一张内容记录了某个页码加上行号的便利贴,可以被当成是一个指向特定页面的指针;根据便利粘贴面的页码与行号,翻到那个页面,把那个页面的那一行文字读出来,就相当于是对这个指针进行反参考的动作。