c指针练习题总结.docx
《c指针练习题总结.docx》由会员分享,可在线阅读,更多相关《c指针练习题总结.docx(30页珍藏版)》请在冰豆网上搜索。
c指针练习题总结
C指针练习题总结
2008-4-17
使用的编译软件是visualc++6.0软件。
练习的结果还没仔细检测,对程序的质量还待考虑。
对指针的程序还没很好理解,先了解指针的含义及格式。
及理解指针的灵活之处,多上机做题培养指针的思维方式。
在信息工程中指针是一个用来指示一个内存地址的计算机语言的变量或中央处理器(CPU)中寄存器(Register)。
指针一般出现在比较近机器语言的语言,如汇编语言或C语言。
面向对象的语言如Java一般避免用指针。
指针一般指向一个函数或一个变量。
在使用一个指针时,一个程序既可以直接使用这个指针所储存的内存地址,又可以使用这个地址里储存的变量或函数的值。
*和&两个地方要注意:
在程序声明变量的时候的*,只是表明“它是一个整数,这个整数指向某个内存地址,一次访问sizeof(type)长度”。
这点不要和(*)操作符混淆;
在C++程序声明变量的时候的&,只是表明“它是一个引用,这个引用声明时不开辟新空间,它在内存分配表加入新的一行,该行内存地址等于和调用时传入的对应参数内存地址”。
这点不要和(*)声明符,(&)操作符混淆。
双重指针(指向指针的指针)
指针数组:
就是一个整数数组,那个数组的各个元素都是整数,指向某个内存地址。
数组指针:
数组名本身就是一个指针,指向数组的首地址。
注意这是一个常数。
指向函数的指针:
从二进制角度考虑,数组名是该数组数据段首地址,函数名就是该代码段的首地址,可以用“int*fun()”。
在二进制层面,代码段和数据段什么区别?
没什么区别。
题1//输入三个整数,按由大到小的顺序输出
#include
voidmain()
{
voidswap(int*p1,int*p2);
intn1,n2,n3;
int*p1,*p2,*p3;
printf("inputthreeintergern1,n2,n3");
scanf("%d,%d,%d",&n1,&n2,&n3);
p1=&n1;
p2=&n2;
p3=&n3;
if(n1>n2)swap(p1,p2);
if(n1>n3)swap(p1,p3);
if(n2>n3)swap(p2,p3);
printf("Now,theorderis:
%d,%d,%d\n",n1,n2,n3);
}
voidswap(int*p1,int*p2)
{
inttemp;
temp=*p1;*p1=*p2;*p2=temp;
}
了解一些c语言的历史
C,是一种通用的程序设计语言,它主要用来进行系统程序设计。
具有高效、灵活、功能丰富、表达力强和移植性好等的特点,在程序员中备受青睐。
C语言是由UNIX的研制者丹尼斯·里奇(DennisRitchie)和肯·汤普逊(KenThompson)于1970年研制出的B语言的基础上发展和完善起来的。
C语言可以广泛应用于不同的操作系统,例如UNIX、MS-DOS、MicrosoftWindows及Linux等。
C语言是一种面向过程的语言,同时具有高级语言和汇编语言的优点。
在C语言的基础上发展起来的有支持多种程序设计风格的C++语言,网络上广泛使用的Java、JavaScript,微软的C#等。
1983年,美国国家标准委员会(ANSI)对C语言进行了标准化,于1983年颁布了第一个C语言标准草案(83ANSIC),后来于1987年又颁布了另一个C语言标准草案(87ANSIC)。
最新的C语言标准是在1999年颁布并在2000年3月被ANSI采用的C99,但由于未得到主流编译器厂家的支持,直到2004年C99并未被广泛使用,增加了若干新特性后C99已经逐渐让C语言和C++分道扬镳。
C语言的特色
C语言是系统程序语言。
流行的操作系统核心部分几乎无一例外的选择了C语言。
C语言保留了低级语言的特性,例如C语言允许使用指针来对任意内存做直接修改。
C语言使用了预处理机制,使得程序员可以在编译源程序之前对程序结构做出控制。
常用的预处理机制包括宏与编译选择等。
C语言的主要不足是缺乏对真实事物的描述手段。
用C语言表达复杂的逻辑系统将会十分困难,而且代码量也明显高于C++语言。
同时C语言过度的信赖程序员的做法也一直存在很大争议,是否允许程序员随意修改内存中的任何东西一直都是争论的焦点所在。
C语言的不足可以由C语言发展而来的新的编程语言所改进。
Cyclone语言拥有提防内存错误的特性。
C++和ObjectiveC提供了用于面向对象的编程结构。
Java和C#在提供面向对象编程结构的同时,也提供了垃圾收集机制,这使得对内存的管理更加透明与自动化。
C语言的主要特性
C语言保留了低阶语言的特性,例如涉及内存的指针。
C语言通过参数在函数里传递数值。
使用了预处理机制,使得程序里可以通过包含例如宏处理的方式来处理根源程序。
C语言提供了一套标准库,这些库里提供了十分有用的功能。
但是并不是所有的这些特性都是有效的。
例如,预处理通常作为一个独立的程序被处理,这使得预处理的程序并不一定被完全编译。
虽然C是高阶语言,但是它同时拥有一些组合语言的特性,对其他的语言来说这是接近低阶语言的特点。
例如,在C语言里,程序师可以对电脑内存进行管理。
在默认的情况下,C语言不会对阵列的范围进行检查,也就是说即使阵列越界,C语言也不会作出错误提示。
对电脑内存的管理使得程序员可以编出更快捷、更有效的程序,这对于设备驱动程序来说尤为重要。
但是这也使得程序容易产生令人讨厌的“臭虫”,例如缓冲器溢出错误。
然而,这些错误可以由一些工具来避免。
C语言的不足可以由从C语言发展而来的更新的编程语言改进。
Cyclone语言的拥有提防对于内存错误的特性。
C++和ObjectiveC提供了用于面向物件的编程结构。
Java和C#增加了面向物件的结构使得对内存的管理自动化。
C语言是国际上广泛流行的,很有发展前途的计算机高级语言.它适合作为系统描述语言,即可用来编写系统软件,也可用来编写应用软件.
早期的操作系统等系统软件主要是用汇编语言编写的(包括 UNIX操作系统在内).由于汇编语言依赖于计算机硬件,程序的可读性和可移植性都比较差.为了提高可读性和可移植性,最好改用高级语言,但一般的高级语言难以实现汇编语言的某些功能(汇编语言可以直接对硬件进行操作),例如:
对内存地址的操作,位操作等).人们设想能否找到一种既具有一般高级语言特性,又具有低级语言特性的语言,集它们的优点于一身.于是,C语言就在这种情况下应运而生了.
C语言是在B语言的基础上发展起来的,它的根源可以追溯到ALGOL 60. 1960年出现的ALGOL 60是一种面向问题的高级语言,它离硬件比较远,不宜用来编写系统程序.1963年英国的剑桥大学推出了CPL(CombinedProgram- ming Language)语言.CPL语言在ALGOL 60的基础上接近了硬件一些,但规模比较大,难以实现.1967年英国剑桥大学的Matin Richards对 CPL语言作了简化,推出了BCPL(Basic Combined Programming Language)语言.1970年美国贝尔实验室的 Ken Thompson以 BCPL语言为基础,又作了进一步简化,设计出了很简单的而且很接近硬件的 B语言( 取 BCPL的第一个字母),并用 B语言写第一个UNIX操作系统,在PDP-7上实现. 1971年在PDP-11/20上实现了B语言,并写了UNIX操作系统.但B语言过于简单,功能有限.1972年至 1973年间,贝尔实验室的 D.M.Ritchie在B语言的基础上设计出了C语言(取 BCPL的第二个字母).C语言既保持了BCPL和B语言的优点(精练,接近硬件),又克服了它们的缺点(过于简单,数据无类型等). 最初的C语言只是为描述和实现UNIX操作系统提供一种工作语言而设计的.1973年,K.Thom- pson和D.M.ritchie两人合作把UNIX的90%以上用 C改写(UNIX第5版.原来的 UNIX操作系统是1969年由美国的贝尔实验室的 K.Thompson和D.M.Ritchie开发成功的,是用汇编语言写的).
后来,C语言多次作了改进,但主要还是在贝尔实验室内部使用.直到1- 975年UNIX第6版公布后 ,C语言的突出优点才引起人们普遍注意.1977年出现了不依赖于具体机器的C语言编译文本《可移植C语言编译程序》,使C移植到其它机器时所做的工作大大简化了,这也推动了UNIX操作系统迅速地在各种机器上实现.例如,VAX,AT&T等计算机系统都相继开发了UNIX.随着 UNIX的日益广泛使用,C语言也迅速得到推广.C语言和UNIX可以说是一对孪生兄弟,在发展过程中相辅相成.1978年以后,C语言已先后移植到大,中,小,微型机上,已独立于UNIX和PDP了.现在C语言已风靡全世界,成为世界上应用最广泛的几种计算机语言之一.
以1978年发表的UNIX第7版中的C编译程序为基础,Brian W.Kernighan和 Dennis M.Ritchie(合称K&R)合著了影响深远了名著《The C Programming Lan- guage》,这本书中介绍的C语言成为后来广泛使用的C语言版本的基础,它被称为标准C.1983年,美国国家标准化协会(ANSI)根据C语言问世以来各种版本对C的发展和扩充 ,制定了新的标准,称为ANSI C.ANSI C比原来的标准C有了很大的发展.K&R在1988年修改了他们的经典著作《The C Progra- mming Language》 ,按照ANSI C的标准重新写了该书.1987年,ANSI C又公布了新标准--87 ANSI C .目前流行的C编译系统都是以它为基础的.
=========
上面说的87ANSI C已经老了,
现在最新的标准是C98
题2./*输入三个字符串,按由小到大的顺序输出*/
#include
#include
voidmain()
{
voidswap(char*,char*);
charstr1[20],str2[20],str3[20];
printf("inputthreeline:
\n");
gets(str1);
gets(str2);
gets(str3);
if(strcmp(str1,str2)>0)swap(str1,str2);
if(strcmp(str1,str3)>0)swap(str1,str3);
if(strcmp(str2,str3)>0)swap(str2,str3);
printf("Now,theorderis:
\n");
printf("%s\n%s\n%s\n",str1,str2,str3);
}
voidswap(char*p1,char*p2)
{
charp[20];
strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p);
}
题3./*输入10个整数,将其中最小的数和第一个数对换,把最大的数与最后一个数对换。
编写三个程序,1、输入十个数,2.进行处理,3输出十个数*/
#include
voidmain()
{
voidinput(int*);
voidmax_min_value(int*);
voidoutput(int*);
intnumber[10];
input(number);
max_min_value(number);
output(number);
}
voidinput(int*number)
{
inti;
printf("input10numbers:
");
for(i=0;i<10;i++)
scanf("%d",&number[i]);
}
voidmax_min_value(int*number)
{
int*max,*min,*p,temp;
max=min=number;
for(p=number+1;pif(*p>*max)
{
max=p;
temp=number[9];
number[9]=*max;
*max=temp;
}
elseif(*p<*min)
{min=p;
temp=number[0];
number[0]=*min;
*min=temp;
}
}
voidoutput(int*number)
{
int*p;
printf("Now,theyare:
");
for(p=number;pprintf("%d",*p);
printf("\n");
}
题4/*有n个整数,使其前面各数顺序向后移m个位置,最后M个数变成最前面m个数*/
#include
voidmain()
{
voidmove(int[20],int,int);
intnumber[20],n,m,i;
printf("howmanynumber?
");
scanf("%d",&n);
printf("input%dnumbers:
",n);
for(i=0;iscanf("%d",&number[i]);
printf("howmanyplaceyouwantmove?
");
scanf("%d",&m);
move(number,n,m);
printf("Now,theyare:
\n");
for(i=0;iprintf("%d",number[i]);
printf("\n");
}
voidmove(intarry[20],intn,intm)//循环后移一次函数
{
int*p,arry_end;
arry_end=*(arry+n-1);
for(p=arry+n-1;p>arry;p--)
*p=*(p-1);
*arry=arry_end;
m--;
if(m>0)move(arry,n,m);
}
题5/*有n个人围城一圈。
从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后
留下的是原来的第几号的那个人*/
#include
voidmain()
{
inti,k,m,n,num[50],*p;
printf("inputnumberofperson:
n=");
scanf("%d",&n);
p=num;
for(i=0;i*(p+1)=i+1;//以1至n为序给每人编号
i=0;
k=0;
m=0;
while(m{
if(*(p+i)!
=0){k++;}
if(k==3)
{
*(p+i)=0;
k=0;
m++;
}
i++;
if(i==n)i=0;//报数到尾后,i恢复为0
}
while(*p==0)p++;
printf("ThelastoneisN0.%d\n",*p);
}
题6/*编写一个函数,求一个字符串的长度。
在main函数中输入字符串,并输出其长度*/
#include
voidmain()
{
intlength(char*p);
intlen;
charstr[20];
printf("inputstring:
");
scanf("%s",str);
len=length(str);
printf("Thelengthofstringis%d.\n",len);
}
intlength(char*p)//求字符串的长度
{
intn=0;
while(*p!
='\0')
{n++;
p++;
}
return(n);
}
题7/*有一字符串,包含n个字符。
编写一个函数,将此字符串中从第m个字符开始
的全部字符复制成为另一个字符串*/
#include
#include;
voidmain()
{
voidcopystring(char*,char*,int);
intm;
charstring1[20],string2[20];
printf("inputstring:
");
gets(string1);
printf("whichcharacterthatbegintocopy?
");
scanf("%d",&m);
if(strlen(string1){printf("inputerror!
");}
else
{
copystring(string1,string2,m);
printf("result:
%s\n",string2);
}
}
voidcopystring(char*p1,char*p2,intm)//字符串复制函数
{
intn=0;
while(n{n++;
p1++;
}
while(*p1!
='\0')
{
*p2=*p1;
p1++;
p2++;
}
*p2='\0';
}
题8/*输入一行文字,找出其中大写字母,小写字母,空格,数字以其他的字符各有多少?
*/
#include
voidmain()
{
intupper=0,lower=0,digit=0,space=0,other=0,i=0;
char*p,s[20];
printf("inputstring:
");
while((s[i]=getchar())!
='\n')i++;
p=&s[0];
while(*p!
='\n')
{
if(('A'<=*p)&&(*p<='Z'))++upper;
elseif(('a'<=*p)&&(*p<='z'))++lower;
elseif(*p=='')++space;
elseif((*p<='9')&&(*p>='0'))++digit;
else++other;
p++;
}
printf("uppercase:
%dlowercase:
%d",upper,lower);
printf("space:
%ddigit:
%dother:
%d\n,",space,digit,other);
}
题9/*编写一个函数,将一个3×3的矩阵转置*/
#include
//#include
//usingnamespacestd;
voidmain()
{
voidmove(intpointer[][3]);
inta[3][3],i,j;
printf("inputmatrix:
\n");
for(i=0;i<3;i++)
scanf("%d%d%d",&a[i][0],&a[i][1],&a[i][2]);
//p=&a[0][0];
move(a);
printf("Now,matrix:
\n");
for(i=0;i<3;i++)
{
//for(intj=0;j<3;j++)
//cout<//cout<for(j=0;j<3;j++)
{
printf("%d\t",a[i][j]);
}
printf("\n");
}
}
voidmove(intpointer[][3])//矩阵转置
{
inti,j,t;
for(i=0;i<3;i++)
for(j=i;j<3;j++)
{
t=pointer[i][j];
pointer[i][j]=pointer[j][i];
pointer[j][i]=t;
}
}
题10/*将一个5×5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从坐到右
,从上到下顺序依次从小到大存放),编写一个函数实现之,用main函数调用*/
#include
voidmain()
{
voidchange(int*);
inta[5][5],*p,i,j;
printf("inputmartix:
\n");
for(i=0;i<5;i++)
{for(j=0;j<5;j++)
scanf("%d",&a[i][j]);
}
p=&a[0][0];
change(p);
printf("Now,martix:
\n");
for(i=0;i<5;i++)
{for(j=0;j<5;j++)
printf("%d",&a[i][j]);
printf("\n");
}
}
voidchange(int*p)//交换函数的实现
{
inti,j,temp;
//intpmax,pmin;
int*pmax,*pmin;
pmax=p;
pmin=p;
//pmax=a[0][0];
//pmin=a[0][0];
for(i=0;i<5;i++)//寻找最大值和最小值
{
for(j=i;j<5;j++)
{
if(*pmax<*(p+5*i+j))
//if(pmaxpmax=p+5*i+j;
//pmax=a[i][j];
if(*pmin>*(p+5*i+j))
//if(pmin)>a[i][j]
pmin=p+5*i+j;
//pmin=a[i][j];
}
}
temp=*(p+12);//最大值换给中心元素
*(p+12)=*pmax;
*pmax=temp;
temp=*p;
*p=*pmin;
*pmin=temp;
pmin=p+1;
for(i=0;i<5;i++)
for(j=0;j<5;j++);
{
if(((p+5*i+j)!
=p)&&(