总结
由于指针一章介绍的内容较多,指针的概念和应用比较复杂,初学者不易掌握,为了帮助读者建立清晰的概念,本节对有关指针的知识和应用作简单的归纳小结。
首先要准确理解指针的含义。“指针”是C语言中一个形象化的名词,形象地表示“指向”的关系,其在物理上的实现是通过地址来完成的。正如高级语言中的“变量”,在物理上是“命名的存储单元”。Windows中的“文件夹”实际上是“目录”。离开地址就不可能弄清楚什么是指针。明确了“指针就是地址”,就比较容易理解了,许多问题也迎刃而解了。例如:
&a是变量a的地址,也可称为变量a的指针。
指针变量是存放地址的变量,也可以说,指针变量是存放指针的变量。
指针变量的值是一个地址,也可以说,指针变量的值是一个指针。
指针变量也可称为地址变量,它的值是地址。
&是取地址运算符,&a是a的地址,也可以说,&是取指针运算符。&a是变量a
的指针(即指向变量a的指针)。
数组名是一个地址,是数组首元素的地址,也可以说,数组名是一个指针,是数组首
元素的指针。
函数名是一个指针(指向函数代码区的首字节),也可以说函数名是一个地址(函数
代码区首字节的地址)。
函数的实参如果是数组名,传递给形参的是一个地址,也可以说,传递给形参的是一
个指针。
本章介绍了指针的基本概念和初步应用。指针是C语言中很重要的概念,是C的一个重要特色。使用指针的优点:①提高程序效率;②在调用函数时当指针指向的变量的值改变时,这些值能够为主调函数使用,即可以从函数调用得到多个可改变的值;③可以实现动态存储分配。
同时应该看到,指针使用实在太灵活,对熟练的程序人员来说,可以利用它编写出颇有特色、质量优良的程序,实现许多用其他高级语言难以实现的功能,但也十分容易出错,而且这种错误往往比较隐蔽。
指针运用的错误可能会使整个程序遭受破坏,比如由于未对指针变量p赋值就向*p赋值,就可能破坏了有用的单元的内容。如果使用指针不当,会出现隐蔽的、难以发现和排除的故障。因此,使用指针要十分小心谨慎,要多上机调试程序,以弄清-些细节,并积累经验。
练习
1、将字符串"software"赋给一个字符指针,并从第一个字母开始间隔地输出该串
输入样例:
在这里给出一组输入。例如:
无
输出样例:
在这里给出相应的输出。例如:
sfwr
#include <stdio.h>
int main()
{
char* a = "software";
char b[9];
char* p = b;
int i = 0;
while (*a != '\0')
{
if (i % 2 == 0 || i == 0)
{
*p++ = *a;
}
a++;
i++;
}
*p = '\0';
printf("%s", b);
return 0;
}
2、将10个数逆序排序,借助指针实现。
输入样例:
21 12 45 43 87 897 534 67 90 75
输出样例:
21 12 45 43 87 897 534 67 90 75
75 90 67 534 897 87 43 45 12 21
#include <stdio.h>
int main()
{
int a[10];
int i,t;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\n");
int *p,*j;
p=&a[0];
j=&a[9];
while(p<=j)
{
t=*p;
*p=*j;
*j=t;
p++;
j--;
}
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
return 0;
}
3、有一个字符串,包含n个字符,写一个函数,将此字符串中从第m个字符开始的全部字符复制成为另外一个字符串。
输入样例:
在这里给出一组输入。例如:
reading__room
10
输出样例:
在这里给出相应的输出。例如:
room
#include "stdio.h"
#include "string.h"
void copystr(char *p1,char *p2,int m);
int main()
{
int m;
char str1[20],str2[20];
gets(str1);
scanf("%d",&m);
if (strlen(str1)<m)
printf("input error");
else
{
copystr(str1,str2,m);
puts(str2);
}
return 0;
}
void copystr(char *p1,char *p2,int m)
{
int i,b=strlen(p1);
for(i=m-1;i<b;i++)
{
*p2=*(p1+i);
p2++;
}
*p2='\0';
}
4、数组指针与二维数组的关系
利用数组指针p将main函数中输入的二维数组a的所有元素输出, 要求先按行的顺序输出,然后再以列的顺序输出, 其中输出整型格式用 "%3d", (测试用数据大小不要超过2位数)。
输入样例:
在这里给出一组输入。例如:
1 2 3
4 5 6
输出样例:
1 2 3
4 5 6
1 4
2 5
3 6
#include <stdio.h>
int main()
{
void reOut(int (*p)[3]);
int i, j, a[2][3], (*p)[3];
for (i = 0; i < 2; i++)
for (j = 0; j < 3; j++)
scanf("%d", &a[i][j]);
p= a;
reOut(p);
}
void reOut(int (*p)[3])
{
int i,j;
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
printf("%3d",*(*(p+i)+j));
}
printf("\n");
}
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
{
printf("%3d",*(*(p+j)+i));
}
printf("\n");
}
}
5、使用函数删除字符串中的字符
输入样例:
3 (repeat=3)
happy new year (字符串"happy new year")
a (待删除的字符'a')
bee (字符串"bee")
e (待删除的字符'e')
111211 (字符串"111211")
1 (待删除的字符'1')
输出样例:
result: hppy new yer (字符串"happy new year"中的字符'a'都被删除)
result: b (字符串"bee"中的字符'e'都被删除)
result: 2 (字符串"111211"中的字符'1'都被删除)
#include <stdio.h>
#include <string.h>
int main()
{
void delchar(char *str,char c);
int i,n;
char c;
scanf("%d\n",&n);
char s[100];
for(i=0;i<n;i++)
{
scanf("%s\n",s);
scanf("%c\n",&c);
delchar(s,c);
printf("result: %s\n",s);
}
return 0;
}
void delchar(char *str,char c)
{
int i,j=0;
for(i=0;str[i]!='\0';i++)
{
if(str[i]!=c)
{
str[j++]=str[i];
}
}
str[j]= '\0';
}