C 再识数组指针 指针数组的概念
参考出处:
http://www.cnblogs.com/mq0036/p/3382732.html
http://www.cnblogs.com/hongcha717/archive/2010/10/24/1859780.html
出处中判断哪个是数组指针和指针数组?
A int*p1[10] B int(*p2)[10]
首先看看他们的类型,在 VS C++中使用sizeof运算符。
printf("%d\n",sizeof(p1)); //结果 40 可以看出是一个数组,每一个元素是一个指针,共有10个指针,所以是指针数组,重点在数组上
printf("%d\n",sizeof(p2)); // 结果 4 可以看出是一个指针,指向的是一个数组。
出处中提出了怎样判断的观点:通过优先符判断,对于 int*p[10] []优先符高,说明是一个数组,每个元素是 int* 类型的指针;对于Int(*p)[10] 优先符()最高,说明是一个指针,指向的是一个整型的一维数组。
然后我们看看如何使用它们获得2维数组的元素值:
int a[2][10] = {{1,1,1,1,1,1,1,1,1,1},{2,2,2,2,2,2,2,2,2,2}};
p1 = a?
p2 = a?
大家都知道 a是一个指向指针的指针常量,a代表整个二维数组的首地址的地址常量,a等价于&a[0] ,是第一个元素的地址,所以指针p2赋值&a[0]是正确的。因为类型相当: 前一种写法不对,后一种对。
那么p1如何赋值呢? 因为p1是指针数组,正确写法是 p1 = a[0] p1=a[1] ...
完整代码如下:
printf("------");
int *p1[10];
printf("%d\n",sizeof(p1));
int (*p2)[10];
printf("%d\n",sizeof(p2));
int a[2][10] = {{1,1,1,1,1,1,1,1,1,1},{2,2,2,2,2,2,2,2,2,2}};
printf("---指针数组的使用---\n");
for (int i=0;i<2;i++)
{
p1[i] = a[i];
for (int j=0;j<10;j++)
{
printf("%d ",p1[i][j]);
}
printf("指针数组每一行的首地址:p1[i] = %d a[i] = %d",p1[i],&a[i]);//1 1 1 1 1 1 1 1 1 1 指针数组每一行的首地址:p1[i] = 13041008 a[i] = 13041008 2 2 2 2 2 2 2 2 2 2 指针数组每一行的首地址:p1[i] = 13041048 a[i] = 13041048
printf("\n");
}
printf("---数组指针的使用---\n");
p2 = a; //写法最简单
for (int i = 0;i<2;i++)
{
for (int j=0;j<10;j++)
{
printf("%d ",p2[0][j]);
}
printf("指针数组每一行的首地址:p2[i] = %d a[i] = %d",p2,&a[i]); //结果和上面对应的一样,这也是这两者的区别
p2++; //如果这地方写 p2++说明是指向下一行的指针 那么访问的时候直接使用 p2[0][j] 向该行逐个移动指针
printf("\n");
}
printf("%d ",a);
printf("%d ",&a);
printf("%d ",&a[0]); 他们三个值是一样的,说明是数组首元素的地址
附int**的使用
int **p = new int *;
int ar1[10]={1,2,3,4,5,6,7,8,910};
p[0] = ar1;//p[0]代表的是int*类型
int ar2[3]={1,2,3};
p[1] = ar2;
int * pm = p[1];
printf("%d",pm[2]);
std::cout<<pm[2];