| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2941 人关注过本帖
标题:用指向数组的指针表示多维数组
只看楼主 加入收藏
郭赛
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2017-12-9
结帖率:77.78%
收藏
已结贴  问题点数:10 回复次数:12 
用指向数组的指针表示多维数组
#include <stdio.h>
#include <stdlib.h>
#define N 2
#define M 2
int main()
{
   //int i=0,j=1;
   int a[M][N][2] = {1,2,3,4,5,6,7,8},(*p)[2]=a[0],(*q)[N][2]=a;

   printf("%p\n",&((*p)[2]));
   printf("%p",&((*q)[N][2]));
   return 0;
}
当把&((*p)[2]) 换成p时,结果变了,为什么?
此程序最终输出结果相同,但是a[0]和a的含义应该不同啊,这是什么原因?

下面这个问题是我遇到书上一个问题的,上面这个是我想检测指针指向的地址
#include <stdio.h>
#include <stdlib.h>
#define I 2
#define J 3
#define K 4


int main()
{
   int v[I][J][K],(*P)[J][K]=v,(*p1)[K]=v[0],n=1;
   int i,j,k;
   for(i=0;i<I;i++)
     for(j=0;j<J;j++)
       for(k=0;k<K;k++)
         {
             *(*(p1+j)+k+i*j*k) = n++;//输入v[i][j][k],最终输出不对
             //*(*(*(p+i)+j)+k) = n++;
         }
   for(i=0;i<I;i++)
     for(j=0;j<J;j++)
       for(k=0;k<K;k++)
         printf("%4d",*(*(p1+j)+k+i*j*k));//表示v[i][j][k],实际不对
         // printf("%4d",*(*(*(p+i)+j)+k));
         return 0;
}



[此贴子已经被作者于2017-12-11 14:14编辑过]

搜索更多相关主题的帖子: 指向 define int printf for 
2017-12-11 13:53
GBH1
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:112
专家分:510
注 册:2017-6-13
收藏
得分:5 
建议上网查一查数组指针和指针数组的区别
2017-12-11 15:01
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:5 
#include <stdio.h>
#include <stdlib.h>
#define I 2
#define J 3
#define K 4

int main()
{
    int v[I][J][K];
    int i,j,k,n=1;
    int *p = (int *)v;
    for(i=0; i<I; i++)
        for(j=0; j<J; j++)
            for(k=0; k<K; k++)
                *(p+i*J*K+j*K+k) = n++;
    for(i=0; i<I; i++)
        for(j=0; j<J; j++)
            for(k=0; k<K; k++)
                printf("%4d", *(p+i*J*K+j*K+k));
                //printf("%4d", v[i][j][k]);
    return 0;
}
2017-12-11 15:17
郭赛
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2017-12-9
收藏
得分:0 
回复 3楼 吹水佬
*(p+i*J*K+j*K+k) = n++;
用这个的话不就和*a = &v[0][0][0]一模一样么?
刚刚那个程序p和q指针都是指向数组的首部地址么?
2017-12-11 16:24
GBH1
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:112
专家分:510
注 册:2017-6-13
收藏
得分:0 
第一个问题:a是数组的首地址,&a是整个数组的地址,a[0]是数组第一个元素的地址,也代表了整个数组的地址,所以a,&a,a[0]的地址相同,都代表了数组的地址。
对于三维数组a[3][2][2]
char (*p)[3][2][2] = &a;//但是如果写成char (*p)[3][2][2] = a则会发生警告,主要是左右两边指针类型不一致,虽然值是相等的,此时需要强制转换成char (*p)[3][2][2]
char (*p)[2][2] = a[0];
char (*p)[2] = a[0][0];


2017-12-11 16:32
郭赛
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2017-12-9
收藏
得分:0 
回复 3楼 吹水佬
为何将代码 *(p+i*J*K+j*K+k) = n++;中的p改为p1就不行了
2017-12-11 16:47
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用郭赛在2017-12-11 16:24:39的发言:

*(p+i*J*K+j*K+k) = n++;
用这个的话不就和*a = &v[0][0][0]一模一样么?

是的,*a = &v[0][0][0]是最易读的表达方式,v[0][0][0]的地址才是数组v的首地址,v只是一个数组名字。
2017-12-11 20:01
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用郭赛在2017-12-11 16:47:37的发言:

为何将代码 *(p+i*J*K+j*K+k) = n++;中的p改为p1就不行了

p、p1只是一个名字,只要是合法的、无冲突的用什么名字都无问题吧。
2017-12-11 20:05
郭赛
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2017-12-9
收藏
得分:0 
以下是引用吹水佬在2017-12-11 20:05:13的发言:


p、p1只是一个名字,只要是合法的、无冲突的用什么名字都无问题吧。


我运行过,显示p可以,而p1则不可以,搞不懂为什么,希望您可以为我解答。
2017-12-11 20:19
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用郭赛在2017-12-11 20:19:43的发言:
我运行过,显示p可以,而p1则不可以,搞不懂为什么,希望您可以为我解答。

怎“不可以”了,具体表现是什么?
2017-12-11 20:28
快速回复:用指向数组的指针表示多维数组
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.054170 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved