指针数组和二维数组
# include<stdio.h>
int main()
{
char *book[]={//数组指针,数组中每个元素都可以使用指针,而每个元素又可以用指针来访问
"<C语言设计语言>",
"<C专家编程>",
"C和指针",
"<C陷阱与缺陷>",//很薄
"<C primer Plus>",
"<带你学C带你飞>", //这些元素都是指针
};
//可以用指向指针的指针的book指针来访问数组
char **fishC[1];//必须定义数组型,不然会报错
fishC[0]=&book[5];//book[5]是指针,&book[5]是指针的指针,所以fish【0】是指向指针的指针
char **xiaoyvlover[5];
int i;
for(i=0;i<5;i++)
{
xiaoyvlover[i]=&book[i];
}
printf("fishC:%s\n\n",*fishC[0]);//*fishC=book[5],book[5]是指针,打印出这个指针
printf("小甲鱼爱的书单:\n");
for(i=0;i<5;i++)
printf("%s\n",*xiaoyvlover[i]) ;
return 0;
}
数组指针//即每个数组元素是指针
# include<stdio.h>
int main()
{
int array[10]={1,2,3,4,5,6,7,8,9};
int *p=array;
int i;
for(i=0;i<10;i++)
{
printf("%d\n",*(p+i));//y也可以*p+i
}
return 0;
# include<stdio.h>
int main()
{
int array[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int **p=array;
int i,j;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
{
printf("%d\n",*(*(p+i)+j));//y也可以*p+i
}
return 0;
这样写错误 因为
printf("p:%p,array;%p\n",p,array);
printf("p+1:%p,array+1:%p",p+1,array+1);//p+1代表加一个地址逻辑单位量4,array+1就是加一
改成这样就对了
# include<stdio.h>
int main()
{
int array[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
// int **p=array;
int i,j;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
{
printf("%d\n",*(*(array+i)+j));
}
return 0;
}
想要用指针指向array就需要用指针数组
# include<stdio.h>
int main()
{
int array[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4]=array;// (*p)和array跨度相同 也可以写成(*p)[3][4]=&array 此时跨度相同
int i,j;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
{
printf("%d\n",*(*(p+i)+j);//如果上面改了,则 *p=a
}
return 0;
当然也可以写成下面这样保证指针数组和等号右边跨度相同即可,但一般不这儿写,太麻烦,看上面的代码就行
# include<stdio.h>
int main()
{
int array[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[3][4]=&array;// (*p)[4]=array;//跨度一样 数组指针 也可以写成(*p)[3][4]=&array 此时跨度相同
int i,j;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
{
printf("%d\n",*(*((*p)+i))+j);//相当于将array 换成(*p)
}
return 0;