main( )
{
int n,a[10],*ptr=a. / *定义时对指针变量初始化* /
for(n = 0. n<=9. n )
scanf("%d", ptr n).
printf("2------output! \n").
for(n=0. n<=9. n )
printf("M", *(ptr n)).
printf("\n").
}
运行程序:
1 2 3 4 5 6 7 8 9 0
2------output!
1 2 3 4 5 6 7 8 9 0
[例6-7] 采用数组名表示的地址法输入输出数组各元素。
main( )
{
int n,a[10],*ptr=a.
for(n = 0. n < = 9. n )
scanf("%d", a n).
printf("3------output! \n").
for(n = 0. n<=9. n )
printf("M", *(a n)).
printf("\n").
}
运行程序:
1 2 3 4 5 6 7 8 9 0
3------output!
1 2 3 4 5 6 7 8 9 0
[例6-8] 用指针表示的下标法输入输出数组各元素。
main( )
{
int n,a[10],*ptr=a.
for(n = 0. n<=9. n )
scanf("%d", &.ptr[n]).
printf("4------output! \n").
for(n = 0. n<=9. n )
printf("M", ptr[n]).
printf("\n").
}
运行程序:
1 2 3 4 5 6 7 8 9 0
4----output!
1 2 3 4 5 6 7 8 9 0
[例6-9] 利用指针法输入输出数组各元素
main( )
{
int n,a[10],*ptr=a.
for(n = 0. n<=9. n )
scanf("%d", ptr ).
printf("5------output! \n").
ptr = a. / *指针变量重新指向数组首址* /
for(n = 0. n<=9. n )
printf("M", *ptr ).
printf("\n").
}
运行程序:
1 2 3 4 5 6 7 8 9 0
5-----output!
1 2 3 4 5 6 7 8 9 0
在程序中要注意*ptr 所表示的含义。*ptr表示指针所指向的变量; ptr 表示指针所指向的变量地址加1个变量所占字节数,具体地说,若指向整型变量,则指针值加2,若指向实型,则加4,依此类推。而printf(“M”, *ptr )中,*ptr 所起作用为先输出指针指向的变量的值,然后指针变量加1。循环结束后,指针变量指向如图6 - 6所示:
指针变量的值在循环结束后,指向数组的尾部的后面。假设元素a[9]的地址为1000,整型占2字节,则ptr的值就为100 2。请思考下面的程序段:
main( )
{
int n,a[10],*ptr=a.
for(n = 0. n<=9. n )
scanf("%d", ptr ).
printf("4------output! \n").
for(n = 0. n<=9. n )
printf("M", *ptr ).
printf("\n").
}
程序与例6 - 9相比,只少了赋值语句p t r = a;程序的运行结果还相同吗?
6.4.2 指针与二维数组
定义一个二维数组:
int a[3][4].
表示二维数组有三行四列共1 2个元素,在内存中按行存放,存放形式为图6 - 7: