内容正文:
第8章 指针
本章内容
8.1指针与指针变量
8.2 指针与数组
8.3 指针与字符串
8.4指针与函数
8.5命令行参数
8.6指向指针的指针变量
8.7综合案例
8.2.2二维数组的指针表示法
二维数组地址的表示方法
a[0][0]可以表示为*(a[0]+0)或*(*(a+0)+0)
图8.6 二维数组的地址表示
程序举例
【例8.6】用指针方式输入输出二维数组各元素。
#include <stdio.h>
main( )
{
int a[3][4];
int i,j;
printf(“
Please input 12 numbers:”);
for(i = 0; i<3; i++)
for(j = 0; j<4; j++)
scanf("%d",a[i]+j); /*第i行第j列元素的地址*/
printf(“
”);
for(i = 0; i<3; i++)
{
for(j = 0; j<4; j++)
printf("%4d",*(*(a+i)+j)); /* *(*(a+i)+j)表示第i行第j列元素*/
printf("
");
}
}
二维数组元素值的表示方法
(1)下标表示方法:
a[i][j];
(2)指针表示方法:
*(*(a+i)+j);
(3)行数组用下标表示方法:
*(a[i]+j);
(4)列用下标表示方法:
(*(a+i))[j];
指向二维数组的指针变量
指向数组元素的指针变量
【例8.7】用指向二维数组的指针方法输入输出二维数组各元素。
#include<stdio.h>
main( )
{
int a[3][4],*p;
int i,j;
p = a[0];
printf(“
Please input 12 numbers:”);
for(i = 0; i<3; i++)
for(j = 0; j<4; j++)
scanf("%d", p++); /*指向二维数组的指针表示方法*/
p = a[0];
printf("
");
for(i = 0; i<3; i++)
{
for(j = 0; j<4; j++)
printf("%4d", *p++);
printf("
");
}
}
行指针
行指针定义的一般形式为:
类型说明符 (*指针变量名)[长度];
例如:
int (*p)[4];
p是一个指针变量,它指向包含4个元素的一维数组
程序举例
【例8.8】用指向一维数组的行指针实现二维数组的输出。
main()
{
int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
int (*p)[4];
int i,j;
p=a;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
printf("%4d",*(*p+j)); /*输出当前行的第j列元素*/
p++; /* 指向下一行 */
printf("
");
}
}
8.3 指针与字符串
字符串的指针表示方法
char c[]=”Hello”;
指向字符串的指针的定义形式为:
char *指针变量名;
例如:
char c[]=”hello”;
char *p=c;
程序举例
【例8.9】编写程序,利用指针的方式,将一个字符串中的指定字符替换为另一个字符。
图8.7 字符数组存储方式
#include <stdio.h>
#include <string.h>
main()
{
char s[80],c1,c2;
char *p=s;
printf("
Please input a string :");
gets(s);
printf("
Please input c1,c2:");
scanf("%c,%c",&c1,&c2);
while(*p!='\0') /*遍历字符串*/
{
if(*p==c1) /*判断当前字符是否为c1*/
*p=c2;
p++; /*指向下一个字符地址*/
}
puts("
result:");
puts(s);
}
程序举例
【例8.10】用指向字符串的指针变量实现两个字符串的合并功能
#include <stdio.h>
#include <string.h>
main( )
{
char s1[50],s2[20];
char *ps1=s1,*ps2=s2;