指针数组概念
一个数组的元素值为指针则是指针数组。 指针数组是一组有序的指针的集合。
一般形式
数据类型 * 数组名[数组长度]
例如
/*
* 编写时间: 2018/8/3
* 编写作者: 流光飞霞
* 程序功能: 指针数组
* 程序版本: V0.1.00
**/
# include <stdio.h>
int main()
{
int a[3][4] =
{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int * p = { a[0], a[1], a[2] };
int * q = { a[0] };
int i;
for ( i = 0; i < 3; i++ )
{
printf ("%d, %d, %d\n", a[i][2-1], *a[i], *(*a+i)+i);
}
for ( i = 0; i < 4; i++ )
{
printf ("%d, %d, %d\n", p[i], q[i], *(p+i) );
}
return 0;
}
q是一个指针数组, 三个元素分别指向二维数组a的各行。 然后用for循环输出制定的数组元素。
指针数组可以作为函数的参量使用,使用方式与普通数组类似。
指针数组常适用于指向若干字符串,这样使字符串处理更加灵活方便。
数组指针
#include <stdio.h>
int main(void)
{
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int (*p)[2] = (int (*)[2])a;
/*
等号左边:声明并定义指针p为数组指针,指向的数组长度为2;
等号右边:a为地址(&a也一样,仅仅是值一样)赋给p,(int (*)[2])为强制类型转换,将a
转换为和p一样的类型;
**/
printf("%d\n", **p); //输出结果是:1 (*p是p指向数组的首地址,*(*p)是首地址内存放的内容)
printf("%d\n", **(*p+1)); //输出结果是:2(*p是p指向数组的首地址,*(*p+1)是数组的第二个元素地址内存放的内容)
printf("%d\n", **(p+1)); /*
输出结果是:3 (p+1指向的的2元素数组为p指向2元素数组的下 一个数组,*(p+1)是p+1指向的数组的首地址内存放的内容)
**/
printf("%d\n", *a); //输出结果是:1 (a为数组的首地址,首地址的内容)
return 0;
}
/*
原文地址: http://blog.sina.com.cn/s/blog_605f5b4f0100x7jq.html
*/
#include <stdio.h>
int main(void)
{
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int (*p)[2] = (int (*)[2])&a; //a是数组首地址。 &a是指向数组的指针
printf("%d\n", **p); //输出结果是:1
printf("%d\n", *(*p+1)); //输出结果是:2
printf("%d\n", **(p+1)); //输出结果是:3
printf("%d\n", *a); //输出结果是:1
printf("%d\n", *(a+1)); //输出结果是:2
printf("%d\n", *(a+9)); //输出结果是:10
printf("%d\n", *(a+10)); //输出结果是:1244948是0012FF14的十进制表示方式,a+10超出了数组a的数组界限,*(a+10)返回的是数组的首地址
printf("%p\n", *(a+10)); //输出结果是:0012FF14
printf("%p\n", a); //输出结果是:0012FF14,数组首地址
printf("%p\n", &a); //输出结果是:0012FF14 指向数组的指针,内存的是数组的地址
printf("%d\n", *(&a)); //输出结果是:1244948
printf("%d\n", **(&a)); //输出结果是:1,*(&a)得到的是数组的地址,**(&a)是数组里面存的元素
printf("%d\n", *(&a+1)); //输出结果是:1244988,&a+1是下一个10元素的int类型数组, *(&a+1)是下一个10元素int数组的地址,可以看到它比*(&a)大了40个字节=int的4个字节*10个int
printf("%p\n", *(&a+1)); //输出结果是:0012FF3C 是 1244988的16进制表示
return 0;
}
/*
原文地址: http://blog.sina.com.cn/s/blog_605f5b4f0100x7jq.html
*/
以上两个程序是看了别人的博客"偷"来的, ↓面是链接, 有点懒了 熬夜成瘾(,,•﹏•,,)
http://blog.sina.com.cn/s/blog_605f5b4f0100x7jq.html
数组指针是指向数组地址的指针,其本质为指针;
指针数组是数组元素为指针的数组(例如 int *p[3],定义了p[0],p[1],p[2]三个指针),其本质为数组。
数组指针的使用在某些情况下与指针数组很相似,要注意区别。