【项目任务】
利用指针来输出一个一维数组中的所有元素。
【设计思路】
在主函数中,定义一个指针p,使其指向数组a的首地址,利用for循环输出数据中的元素。
【程序代码】
#include <stdio.h>
main()
{
int a[5]={10,20,30,40,50};
int *p;
int i;
p=a; /*等价于p=&a[0]*/
for(i=0;i<5;i++)
printf("%d ",*(p+i)); /*等价于p[i]*/
printf("\n");
}
【运行结果】
10 20 30 40 50
【知识拓展】
数组元素存放在一片连续的存储空间上。所谓数组的指针也就是数组的首地址,数组元素的指针是各个数组元素的地址。
数组名,即数组的首地址,是一个地址常量。数组中第0个元素的地址可以表示成&a[0]、&*(a+0)、a+0、a;,第i个元素的地址可以表示成&a[i]、&*(a+i)、a+i;,第i个元素的引用可以表示成a[i],*(a+i)。
使一个指针指向数组的首地址,通过指针运算就可以找到数组中的任意一个元素。指针的算术运算有++,--,+,-等,其中p++表示指针向后移动一个单位,注意不是移动一个字节,移动的大小由指针的基类型决定。如一个指针变量指向一个整型变量(2个字节),那么指针变量加1表示指针向后移动2个字节。
以上程序也可以改写为:
#include <stdio.h>
main()
{
int a[5]={10,20,30,40,50};
int *p;
for(p=a;p<a+5;p++) /*该处的for循环也可以修改成:
for(p=a;p<a+5;)
printf("%d ",*p++);*/
printf("%d ",*p);
printf("\n");
}
本案例中,指针的值没有改变,只是使p+i指向不同的数组元素,达到遍历数组的目的。而改写后的程序,则利用p++的算术运算改变了指针p的值,使其指向不同的数组元素。
【项目任务】
利用指针来输出一个二维数组中的所有元素。
【设计思路】
在主函数中,定义一个行指针p,使其指向数组a的第一行,利用两层嵌套for循环输出数据中的所有元素。
【程序代码】
#include <stdio.h>
main()
{
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int (*p)[4]; /*p为指向具有4个元素的一维数组的行指针*/
int i,j;
p=a; /*等价于p=&a[0]*/
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
printf("%-3d",*(*(p+i)+j));/*等价于p[i][j]*/
printf("\n");
}
}
【运行结果】
1 2 3 4
5 6 7 8
9 1011 12
【知识拓展】
1.p为指向具有4个元素的一维数组的行指针,具体含义是p所指向的实体的类型不是数组中的某一个元素,而是4个元素组成的一个整体。如整型数组a(一个整型变量占2个字节),p+1就表示移动一行(4个数组元素的大小单位,即8个字节)。如果p仅仅是指向数组中一个元素的指针,则p+1只表示移动一个元素的大小单位,即2个字节。
2.行指针指向二维数组的某一行,行指针加1,表示向后移动一行;相应的列指针指向二维数组的某一行、某一列中的一个数组元素,列指针加1,则表示向后移动一列。
· p+i表示行指针,指向二维数组的第i行。
· p[i]+j、*(p+i)+j表示列指针,它指向第i行,第j列元素。
· *(*(p+i)+j)、*(p[i]+j)、p[i][j]则表示a[i][j]元素的引用。
【项目任务】
利用指针输出一个字符串中的元素。
【设计思路】
定义一个字符指针,指向字符串的首地址,利用While循环遍历字符串。
【程序代码】
#include <stdio.h>
main()
{
char str[]="Hello,world!\n";
char *p;
p=str; /*p指向字符串的首地址*/
while(*p) /*等价于*p!=’\0’*/
{
printf("%c",*p);
p++;
}
}
【运行结果】
Hello,world!
【知识拓展】
1.字符串的结束标志为字符‘\0’,该字符的ASCII码值为0,所以遍历字符串的循环结束条件是*p、*p !=0或*p !=‘\0’。
2.while语句的循环体可以用语句printf("%c",*p++);替代。
3.本案例采用指针法,除此之外,还经常采用下标法处理类似的问题。
采用下标法处理本案例的程序代码如下:
#include <stdio.h>
main()
{
char str[]="Hello,world!\n";
int i;
for(i=0;str[i]!=’\0’;i++) /*等价于str[i]*/
printf("%c",str[i]);
}
【项目任务】
利用指针,使数组中的元素首尾逆置。
【设计思路】
定义一个首指针,指向数组的第一个元素;定义一个尾指针,指向数组的最后一个元素。在循环过程中,利用首、尾指针交换数组的首、尾元素的值;同时,首指针向后移动,尾指针向前移动,两指针会面,循环结束。
【程序代码】
#include <stdio.h>
main()
{
int a[5]={10,20,30,40,50},temp;
int *p,*q;
int k;
p=a; /*首指针*/
q=a+4; /*尾指针*/
while(p<q)
{
/*交换首、尾元素*/
temp=*p; *p=*q; *q=temp;
/*首指针向后移动,尾指针向前移动*/
p++,q--;
}
for(k=0;k<5;k++)
printf("%d ",a[k]);
printf("\n");
}
【运行结果】
50 40 30 20 10
【知识拓展】
交换数组中首、尾元素的值,除了可以采用指针法,也可以采用下标法,代码如下:
#include <stdio.h>
main()
{
int a[5]={10,20,30,40,50},temp;
int i,j,k;
for(i=0,j=4;i<j;i++,j--)
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
for(k=0;k<5;k++)
printf("%d ",a[k]);
printf("\n");
}