指针数组定义
一维指针数组的定义形式
类型名 *数组名[数组长度];
char *p[5];
一个数组,若其元素均为指针类型数据,称为指针数组,
指针数组中的每一个元素都相当于一个指针变量。
指针数组的初始化
使用地址为指针数组初始化
char *p[5]={“wangxiao”,”zhangyi”,”wenhua”,
”chenxu”,”liming”};
指针数组和二级指针
int main( )
{ int i,k,j;
static char *str[4]={“Program”,”Fortran”, ” C” ,”Basic”};
char *temp; /*定义指针 *temp,作为临时变量交换两个字符串*/
for(i=0;i<4;i++)
for(j=i+1;j<4;j++)
if ( strcmp(str[i],str[j] ) > 0 )
{ temp=str[j] ;
str[j]=str[i];
str[i]=temp;
}
for(i=0; i<4; i++)
printf(“%s\n”,str[i] );
return 0;
}
访问二维数组中的元素
int a[3][3]= { 1, 2,3, 4,5,6, 7,8,9 };
int *pa[3] = { a[0], a[1], a[2] };
(1) 二维数组的每一行都可以看成一个一维数组,a[0],a[1],a[2]为数组名,
所以a[0],a[1],a[2] 是地址。
(2) 对指针数组中的第i 个元素, pa[i] 指向二维数组第i行的第一个元素。
(3) pa[i] 移动到第j列,指向a[i][j]元素
*(pa[ i ]+j) 从指针数组元素的地址访问后续元素;
*(a[ i ]+j ) 从一维数组的首地址访问后续元素;
*(*(a+i )+j ) 从二维数组的首地址访问后续元素;
a[ i ] [ j ] 二维数组下标法
上述四个表达式等价
指针的指针:指向指针变量的指针变量。指针的指针存放的是指
针变量地址。(二级指针)
指针的指针的定义
格式: 类型 **指针变量名;
int i=2; /* 定义整型变量i */
int *p1,**p2; /* 定义p1为整型指针,定义p2为整型指针的指针 */
p1=&i; /* i的地址=>p1,即指针p1指向变量i */
p2=&p1; /* 指针p1的地址=>p2,即指针p2指向指针p1 */
对变量i的访问 i, *p1, **p2。
使用指向指针的指针。
/*二级指针应用*/
#include<stdio.h>
int main()
{ char *name[ ]={"Book","Cell Phone", "Table","Program","Computer"};
/*定义指针数组,并用字符串为其初始化*/
char **p;
int i;
for(i=0;i<5;i++)
{ p=name+i; /*二级指针指向指针数组*/
printf("%s\n",*p); }
return 0;
}
例:一个指针数组的元素指向整型数据。
#include <stdio.h>
int main( )
{ int a[5]={1,3,5,7,9};
int *num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};
int **p, i;
p=num;
for(i=0;i<5;i++)
{ printf(“%5d”,**p);
p++;
}
return 0;
}
指针与数组的等价性--数组名代表起始地址
一个一维数组和一个指针等价,都代表地址,都可以访问数组中
的所有元素;int a[10] 与指针 int *pa
一个二维数组,可以看成是一个一维数组,每个元素又是个一维
数组;int a[3][4] 与int a[3]={a[0],a[1],a[2]}
一个指针数组,指向二维数组的每一行,指针数组的数组元素是
指针,所以指向指针数组的指针就是指针的指针。即,可以使用
“指针的指针”指向指针数组。int *pa[3],int a[3][4]与int **p
等价
指针说明 含 义
int i; 定义整型变量i
int *p; p为指向整型数据的指针变量
int a[10]; 定义整型数组a,它有10个元素
int *p[10]; 定义指针数组p,它由10个指向整型数据的指针元素组成
int (*p)[10]; p为指向含10个元素的一维数组的指针变量
int f( ); f为带回整型函数值的函数
int *f( ); p为带回一个指针的函数,该指针指向整型数据
int (*p)( ); p为指向函数的指针,该函数返回一个整型值
int **p; p是一个指针变量,它指向一个指向整型数据的指针变量
指针与多维数组