指针数组到底是什么东西?
本帖最后由 haiouda 于 2015-3-28 17:51 编辑/****************************************
写一个函数,将一个 3*3 的整型矩阵转置。
****************************************/
#if(1)
#include <stdio.h>
#define xx 3 //设置矩阵大小
#define xx1 10 //调协矩阵单元大小
int main()
{
char a={0},*c,*d;
int i,k,j=0;
for (i=0;i<xx;i++) //输入矩阵,每次回车,代表一个字符串(矩阵单元)输入结束
{
for (k=0;k<xx;k++,j++)
{
c=a;
gets(a);
}
}
printf("\n");
#if(0)
for(k=0,j=0;k<xx;k++) //矩阵顺时针旋转90度
{
for(i=xx-1;i>=0;i--,j++)
{
d=a;
}
}
#endif
#if(1)
for(k=0,j=0;k<xx;k++) //矩阵顺时针旋转90度
{
for(i=xx-1;i>=0;i--,j++)
{
*(d+j)=*(*(a+i)+k);
}
}
#endif
for (j=0,k=1;j<xx*xx;j++,k++) // 打印原矩阵
{
printf("%s ",c);
if (k%xx==0)
{
printf("\n");
}
}
printf("\n");
for (j=0,k=1;j<xx*xx;j++,k++) //打印旋转后的矩阵
{
printf("%s ",d);
if (k%xx==0)
{
printf("\n");
}
}
return 0;
}
#endif
指针数组到底是什么?
第45行:*(d+j),这里应该是个地址,而我却把一个字符串放进一个地址里了,没用出错,一切正常;
而书上说,指针数组,是一组指针而以;什么是指针呢,指针就是指向地址的 "手指",指针就是地址,指针里存的就是地址,只能是地址!
由上面程序,最终猜想----
由于 *srt="I love fishc.com"这里把 *srt当做一维数组处理。
所以上面第45行就可解释通了。
所以,指针数组是二维数组的特例! 请问我猜想的对么(汇编水平差呀,不然就能直接搞明白不用猜了)?
本帖最后由 ryxcaixia 于 2015-5-14 08:29 编辑
以最简单的例子来说, 一维指针数组
指针数组是一个数组, 存了一堆指针, 是指针的集合, 由一个二级指针指向这个一维指针数组, 如 int** Arr = 类似这种
而每个指针又指向一个地址, 如为一级指针, 比如a或b 他们各自指向一个数列
但是任何的二维(多维)实际上都是一维的, 即堆栈上一字排开
以下面的例子来说, 我创建了二维数组, 即可以用二维数组的方式访问, 也可以用一维的方式访问
创建一维数组, 也可以用二维数组的方式访问, 也可以用一维的访问.int main()
{
int Height = 5;
int Width = 10;
// 这是普通的二维数组
int TwoDimen = {0};
for (int i = 0; i != Height; i++)
for (int j = 0; j != Width; j++)
TwoDimen = i * j;
// 对二维数组按照二维数组的方式访问
for (int i = 0; i != Height; i++)
{
for (int j = 0; j != Width; j++)
cout << TwoDimen << ' ';
cout << endl;
}
// 对二维数组按照一维数组的方式访问
cout << "-----------------------------------------------------------------" << endl;
for (int i = 0; i != Height; i++)
{
for (int j = 0; j != Width; j++)
cout << *(*(TwoDimen + i)+j) << ' ';
cout << endl;
}
// 对二维数组按照一维数组的方式访问
cout << "-----------------------------------------------------------------" << endl;
for (int i = 0; i != Height; i++)
{
for (int j = 0; j != Width; j++)
cout << *(*TwoDimen + i*Width + j) << ' ';
cout << endl;
}
cout << "-----------------------------------------------------------------" << endl;
// 这是一维数组
int* OneDimen = (int*)malloc(sizeof(int) * (Height * Width));
for (int i = 0; i != Height; i++)
for (int j = 0; j != Width; j++)
OneDimen = i * j;
// 对一维数组按照已维数组的方式访问
for (int i = 0; i != Height; i++)
{
for (int j = 0; j != Width; j++)
cout << OneDimen << ' ';
cout << endl;
}
cout << "-----------------------------------------------------------------" << endl;
// 对一维数组按照二维数组的方式访问
for (int i = 0; i != Height; i++)
{
for (int j = 0; j != Width; j++)
cout << *((OneDimen+i*Width) + j) << ' ';
cout << endl;
}
free(OneDimen);
OneDimen = NULL;
return 0;
}
可以看出, 任何指针数组内的成员(一个一级指针), 与下一个成员间隔的距离都是28H, 即十进制的40, 即sizeof(int) * 10, 十个整形元素
所以CPU不认识一维指针数组还是二维指针数组, 他只认地址, 而定义成多级指针不过是方便程序员书写, 而在最底层(本例中的整形指针数组), 都是一字排开
以上的情况多见于矩阵, 如函数指针数组, 即数组内的每个指针指向了每个函数的首地址, 这样的自然不是连续的.一言以蔽之, 指针数组就是存了一堆地址的数组, 这些地址可以是某个数列或矩阵的地址, 可以是某个元素的, 可以是某个函数的, 可以是某个资源的, 前提是类型都要一样, 然后把这些地址存到一个地方, 方便程序员进行读写操作访问等
本帖最后由 haiouda 于 2015-4-1 12:55 编辑
{:1_1:} 楼主速度好快,坐等大神 指针数组和二维数组没有必然的联系,对于指针数组它是数组,就像整形、字符型数组一样只不过指针数组它的每一个元素都是指针类型。对于二维数组和指针的关系,可以这样说:我们定义一个二维数组int a,我们可以通过该数组的首地址索引数组的每一个元素,比如*(*(a+i)+j)就是a,另外也可以通过一个指向二维数组的指针变量来索引,比如int *p,表示该指针变量指向两列的二维数组,同样可以通过*(*(p+i)+j)索引a;
而指针数组是这样应用的,比如 int *p;inta; p=a+1表示指针变量p存储二维数组第一行的首地址,总之对于指针数组你要知道他是数组,元素类型为指针类型就ok,对于矩阵转置的问题,你先定义一个二维数组存放数值,在定义一个二维数组和刚才那个一样大小,在通过循环就搞定!!! :shutup: {:1_1:} :big {:1_1:}
:sweat:我认错了
{:1_1:} {:1_1:} 一个指针就是一个地址,一组指针形成一个指针数组,就相当于这个数组里的元素全都是地址,一个元素一个地址,我是这么理解的,仅供参考,啦啦啦~ 新人飄過,感覺有點複雜。。。 {:1_1:} 都是指针的数组
页:
[1]