指针数组与数组指针
1、介绍(百度百科):
数组指针是指向数组地址的指针,其本质为指针;
指针数组是数组元素为指针的数组(例如 int *p[3],定义了p[0],p[1],p[2]三个指针),其本质为数组。
2、代码:
#include <stdio.h>
int main()
{
int *p1[3];//指针数组,本质:数组
int (*p2)[3];//数组指针,本质:指针
int *p3;//int 指针
int a[3][3]={1,2,3,4,5,6,7,8,9};
int b[4]={10,11,13,14};
//指针数组
printf("指针数组\t");
for(int i=0;i<2;++i)
{
p1[i]=a[i];
}
p1[2]=b;
for(int i=0;i<3;++i)
{
printf("%d\t",*(p1[i]+1));//每个数组第二个元素
}
//数组指针
printf("\n数组指针\t");
p2=b;
for(int i=0;i<3;++i)
{
printf("%d\t",(*p2)[i]);//数组式访问
}
printf("\n\t\t");
for(int i=0;i<3;++i)
{
printf("%d\t",*(*(p2)+i));//指针式访问
}
//数组名
printf("\n数组名\tb:%d\t&b:%d\t&b[0]:%d",b,&b,&b[0]);
//int指针
p3=b;
printf("\nint 指针 p3[1] %d\n",p3[1]);//将常量给变量,两种访问形式
return 0;
}
3、结果:
4、总结:
A、指针数组:是一个数组p[],里面都装的指针,指向某数组(大小不限),p+1跳跃到下一个数组元素(也是指针)。
B、数组指针:是一个指针p,指向该类型数组a(大小已定)。p+1跳跃整个数组a,指向数组a结束处。说白了,就是指针,然后(*p)。当然,如果将他指向二维数组则指向每行。
p2=a;
for(int i=0;i<3;++i)
{
printf("%d\t",(*p2)[i]);//数组式访问第一行
}
printf("\n\t\t");
for(int i=0;i<3;++i)
{
printf("%d\t",*(*(p2+1)+i));//指针式访问第二行
}
这里的数组跳跃,就是跳跃二维数组的每个子数组。这时候,他就是二维数组指针。而对于指针数组,他的每一个元素需要进行初始化,是无法像数组指针这样初始化后访问的。
C、还有数组名,b和&b的值是一样的,我觉得应该是&b当作&b[0]来对待的。
数组传入函数后的故事
1、代码:
#include <stdio.h>
#include <stdlib.h>
//指针数组
void writelines(char *lineptr[], int nlines)
{
while (nlines-- > 0)
printf("%s\n", *lineptr++);//指针变量
}
int main()
{
char *lineptr[]={"qqqq","aaaaaa","bbbbb"};
int n=3;
while (n-- > 0)
printf("%s\n", lineptr[n]);//指针常量
printf("\nHello world!\n");
writelines(lineptr,3);
return 0;
}
2、结果:
3、总结:
指针数组传入函数后做变量!!!