鱼C论坛

 找回密码
 立即注册
查看: 2671|回复: 16

指针数组到底是什么东西?

[复制链接]
发表于 2015-3-28 17:38:59 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 haiouda 于 2015-3-28 17:51 编辑
/****************************************
写一个函数,将一个 3*3 的整型矩阵转置。
****************************************/



#if(1)
#include <stdio.h>
#define xx 3        //设置矩阵大小
#define xx1 10      //调协矩阵单元大小

int main()
{
        char a[xx][xx][xx1]={0},*c[xx*xx],*d[xx*xx];
        int i,k,j=0;
        
        for (i=0;i<xx;i++)                   //输入矩阵,每次回车,代表一个字符串(矩阵单元)输入结束
        {
                for (k=0;k<xx;k++,j++)
                {
                        c[j]=a[i][k];
                        
                        gets(a[i][k]);
                }          
                
        }
        printf("\n");
        
#if(0)
        for(k=0,j=0;k<xx;k++)        //矩阵顺时针旋转90度
        {
                for(i=xx-1;i>=0;i--,j++)
                {
                        d[j]=a[i][k];
                        
                }
        }
#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[j]);   
                if (k%xx==0)
                {
                        printf("\n");
                }
                
        }
        
        printf("\n");
        
        for (j=0,k=1;j<xx*xx;j++,k++)   //打印旋转后的矩阵
        {
                
                
                printf("%s ",d[j]);
                if (k%xx==0)
                {
                        printf("\n");
                }
                
        }
        
        return 0;
        
}
#endif
指针数组到底是什么?
第45行:*(d+j),这里应该是个地址,而我却把一个字符串放进一个地址里了,没用出错,一切正常;
而书上说,指针数组,是一组指针而以;什么是指针呢,指针就是指向地址的 "手指",指针就是地址,指针里存的就是地址,只能是地址!

由上面程序,最终猜想----
由于 *srt="I love fishc.com"这里把 *srt当做一维数组处理。
所以上面第45行就可解释通了。

所以,指针数组是二维数组的特例! 请问我猜想的对么(汇编水平差呀,不然就能直接搞明白不用猜了)?

最佳答案

查看完整内容

以最简单的例子来说, 一维指针数组 指针数组是一个数组, 存了一堆指针, 是指针的集合, 由一个二级指针指向这个一维指针数组, 如 int** Arr = 类似这种 而每个指针又指向一个地址, 如为一级指针, 比如a或b 他们各自指向一个数列 但是任何的二维(多维)实际上都是一维的, 即堆栈上一字排开 以下面的例子来说, 我创建了二维数组, 即可以用二维数组的方式访问, 也可以用一维的方式访问 创建一维数组, 也可以用二维数组的方式访问, ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-3-28 17:39:00 | 显示全部楼层
本帖最后由 ryxcaixia 于 2015-5-14 08:29 编辑

以最简单的例子来说, 一维指针数组
指针数组是一个数组, 存了一堆指针, 是指针的集合, 由一个二级指针指向这个一维指针数组, 如 int** Arr = [int* a, int* b,.....]类似这种
而每个指针又指向一个地址, 如为一级指针, 比如a或b 他们各自指向一个数列
但是任何的二维(多维)实际上都是一维的, 即堆栈上一字排开
以下面的例子来说, 我创建了二维数组, 即可以用二维数组的方式访问, 也可以用一维的方式访问
创建一维数组, 也可以用二维数组的方式访问, 也可以用一维的访问.
int main()
{
        int Height = 5;
        int Width = 10;

        // 这是普通的二维数组
        int TwoDimen[5][10] = {0};
        for (int i = 0; i != Height; i++)
                for (int j = 0; j != Width; j++)
                        TwoDimen[i][j] = i * j;

        // 对二维数组按照二维数组的方式访问
        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)+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*Width + j] = i * j;

        // 对一维数组按照已维数组的方式访问
        for (int i = 0; i != Height; i++)
        {
                for (int j = 0; j != Width; j++)        
                        cout << OneDimen[i*Width + j] << ' ';
                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;
}




PointArr.png
可以看出, 任何指针数组内的成员(一个一级指针), 与下一个成员间隔的距离都是28H, 即十进制的40, 即sizeof(int) * 10, 十个整形元素
所以CPU不认识一维指针数组还是二维指针数组, 他只认地址, 而定义成多级指针不过是方便程序员书写, 而在最底层(本例中的整形指针数组), 都是一字排开

以上的情况多见于矩阵, 如函数指针数组, 即数组内的每个指针指向了每个函数的首地址, 这样的自然不是连续的.一言以蔽之, 指针数组就是存了一堆地址的数组, 这些地址可以是某个数列或矩阵的地址, 可以是某个元素的, 可以是某个函数的, 可以是某个资源的, 前提是类型都要一样, 然后把这些地址存到一个地方, 方便程序员进行读写操作访问等


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-3-28 20:20:45 | 显示全部楼层
本帖最后由 haiouda 于 2015-4-1 12:55 编辑


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-1 09:57:40 | 显示全部楼层
{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-1 10:16:07 | 显示全部楼层
楼主速度好快,坐等大神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-1 21:00:35 | 显示全部楼层
指针数组和二维数组没有必然的联系,对于指针数组它是数组,就像整形、字符型数组一样只不过指针数组它的每一个元素都是指针类型。对于二维数组和指针的关系,可以这样说:我们定义一个二维数组int a[2][2],我们可以通过该数组的首地址索引数组的每一个元素,比如*(*(a+i)+j)就是a[i][j],另外也可以通过一个指向二维数组的指针变量来索引,比如int *p[2],表示该指针变量指向两列的二维数组,同样可以通过*(*(p+i)+j)索引a[i][j];
而指针数组是这样应用的,比如 int *p[2][2];inta[2][2];    p=a+1表示指针变量p存储二维数组第一行的首地址,总之对于指针数组你要知道他是数组,元素类型为指针类型就ok,对于矩阵转置的问题,你先定义一个二维数组存放数值,在定义一个二维数组和刚才那个一样大小,在通过循环就搞定!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-1 21:21:27 | 显示全部楼层
:shutup:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-2 19:24:39 | 显示全部楼层
{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-2 19:28:07 | 显示全部楼层
:big
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-2 20:38:31 | 显示全部楼层
{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-4-2 23:57:19 | 显示全部楼层
:sweat:  我认错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-12 21:23:08 | 显示全部楼层
{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-13 11:48:44 | 显示全部楼层
{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-26 16:07:15 | 显示全部楼层
一个指针就是一个地址,一组指针形成一个指针数组,就相当于这个数组里的元素全都是地址,一个元素一个地址,我是这么理解的,仅供参考,啦啦啦~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-5-19 20:27:05 | 显示全部楼层
新人飄過,感覺有點複雜。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-10 15:25:31 | 显示全部楼层
{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-15 13:47:09 | 显示全部楼层
都是指针的数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 01:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表