| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 442 人关注过本帖
标题:请教:二级指针怎么和一个二维数组关联起来
只看楼主 加入收藏
skyone2013
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2013-5-4
结帖率:0
收藏
已结贴  问题点数:20 回复次数:7 
请教:二级指针怎么和一个二维数组关联起来
二级指针怎么和一个二维数组关联起来
char a[x][y];
用数组名:第i行 第j列
可以表示为 *(a+i)+j
2013-07-23 19:06
岁月如刀
Rank: 6Rank: 6
来 自:冰冻星球
等 级:侠之大者
威 望:7
帖 子:165
专家分:477
注 册:2013-7-21
收藏
得分:5 

char **p = a; or char (*p)[y] = a;....


Now. Game over.
2013-07-23 19:43
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:5 
其实提问问题之前先自己思考一下,然后再百度,百度都看不懂再来提问也不迟

思考赐予新生,时间在于定义
2013-07-23 20:15
skyone2013
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2013-5-4
收藏
得分:0 
如果采用**p=a方式关联,有一个问题:

#include<stdio.h>
#include<stdlib.h>
void main(void)
{
char arr[3][4];
char **ar=arr;
int i;

 arr[0][0]='a';
 arr[0][1]='b';
 arr[0][2]='c';
 arr[0][3]='\0';
 arr[1][0]='d';
 arr[1][1]='e';
 arr[1][2]='f';
 arr[1][3]='\0';
 arr[2][0]='g';
 arr[2][1]='h';
 arr[2][2]='i';
 arr[2][3]='\0';
putchar(*(*(ar+1)+1));
 return 0;
}
结果输出为:‘a’
*(*(ar+1)+1)应该等价于ar[1][1]指向 arr[1][1]吧,结果应该是‘e’吧。
2013-07-23 20:28
岁月如刀
Rank: 6Rank: 6
来 自:冰冻星球
等 级:侠之大者
威 望:7
帖 子:165
专家分:477
注 册:2013-7-21
收藏
得分:0 
以下是引用skyone2013在2013-7-23 20:28:44的发言:

如果采用**p=a方式关联,有一个问题:

#include<stdio.h>
#include<stdlib.h>
void main(void)
{
char arr[3][4];
char **ar=arr;
int i;

 arr[0][0]='a';
 arr[0][1]='b';
 arr[0][2]='c';
 arr[0][3]='\0';
 arr[1][0]='d';
 arr[1][1]='e';
 arr[1][2]='f';
 arr[1][3]='\0';
 arr[2][0]='g';
 arr[2][1]='h';
 arr[2][2]='i';
 arr[2][3]='\0';
putchar(*(*(ar+1)+1));
 return 0;
}
结果输出为:‘a’
*(*(ar+1)+1)应该等价于ar[1][1]指向 arr[1][1]吧,结果应该是‘e’吧。


这个问题提得好啊~ 让我再度重温了下C的二级指针与指向数组的指针。谢谢你。

二级指针是指向指针的指针,


程序代码:
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
    char arr[3][4];
    char **ar = (char**)arr;
    int i, j;
    int col = 0;
    int row = 0;
    
    printf("ar = 0x%x\n", ar);
    
    arr[0][0]='a';
    arr[0][1]='b';
    arr[0][2]='c';
    arr[0][3]='\0';
    
    arr[1][0]='d';
    arr[1][1]='e';
    arr[1][2]='f';
    arr[1][3]='\0';
    
    
    arr[2][0]='g';
    arr[2][1]='h';
    arr[2][2]='i';
    arr[2][3]='\0';
    
    for(i = 0; i < 3; i++){
        for(j = 0; j < 4; j++){
            printf("arr[%d][%d] = 0x%x\n", i, j, &arr[i][j]);
        }
        printf("\n");
    }
    
    row = 1;
    col = 1;
    
    printf ("sizeof(char) = %d\n", sizeof(char));
    
    printf("Addr = 0x%x.\n", ((char*)ar + 4 * row + col));
    printf("*ar => %c\n", *((char*)ar + 4 * row + col));
    //putchar(*((*ar + sizeof(char) * 1) +1));
    
    return 0;
}



考虑这段代码~~~

程序代码:
#include<stdio.h>
#include<stdlib.h>

int main(void)
{
    char **arr    = (char**)malloc(sizeof(char*) * 3);
    char **ar    = arr;
    
    int i, j;
    
    for(i = 0; i < 3; ++i) {
        arr[i] = (char*)malloc(sizeof(char) * 4);
    }
    
    arr[0][0]='a';
    arr[0][1]='b';
    arr[0][2]='c';
    arr[0][3]='\0';
    
    arr[1][0]='d';
    arr[1][1]='e';
    arr[1][2]='f';
    arr[1][3]='\0';
    
    arr[2][0]='g';
    arr[2][1]='h';
    arr[2][2]='i';
    arr[2][3]='\0';
    
    for(i = 0; i < 3; i++){
        for(j = 0; j < 4; j++){
            printf("arr[%d][%d] = 0x%x\n", i, j, &arr[i][j]);
        }
        printf("\n");
    }
    
    putchar(*(*(ar+1)+1));
    
    // Remember free!
    for(i = 0; i < 3; ++i) {
        free(arr[i]);
    }
    free(arr);
    
    return 0;
}

Now. Game over.
2013-07-23 22:07
skyone2013
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2013-5-4
收藏
得分:0 
精辟,小生会仔仔细细研究!多谢!
2013-07-23 22:19
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:5 
有个公式,照搬就行了
p[i]=*(p+i)
所以p[i][j]=*(p+i)[j]=*(*(p+i)+j)

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2013-07-26 06:56
好男儿!
Rank: 2
来 自:陕西省
等 级:论坛游民
帖 子:29
专家分:52
注 册:2013-7-26
收藏
得分:5 
基础:(指针与一维数组)           本质:                a[i]  <=>  *(a+i)
                                   变换:             a[i]<=>*(a+i)<=>*(i+a)<=>i[a]

指针与二维数组:

1. 本质:type a[10],*p;
p=a;
以后,可以用P代替a,引用数组中的各元素,即  p[i] <=> a[i]; 设type类型为int[20]
type a,b;<=>int[20] a,b;<=>int a[20],b[20];
type a[10],*p;<=>int[20]a[10],*p;<=>int a[10][20],(*p)[20];

int *p[20];   <=>int* p[20];<=>type p[20];  sizeof(p)=80B(字节) p是由20个int*(整形指针)为数组元素组成的数组,p+1将移动4B;
int (*p)[20]; <=>int[20] *p;<=>type *p;     sizeof(p)=4B(字节) p是一个指类(指针所指向的空间的数据类型)为int[20]的指针变量,p+1将移动80B;
int a[10][20];<=>int[20]a[10];<=>type a[10];  a是一个指类为int[20]的指针常量,a+1将移动80B;

int (*p)[20];指针变量的指类为int[20],意味着p+1将移动80B,相当于移动了a[10][20]整整一行的空间,所以变量p又称为行指针,因此,在a[10][20]中,数组名称
a,实质上就是“行指针”常量,且a+1将移动整整一行!  又名:数组指针常量。

2. 二维数组的引用(行的引用)
 
char s[10][20];int i;
下标为i的那行首地址的表达(每一行首地址,等价于该行首元素首地址):
&s[0][0]<=>&*(s[0]+0)<=>s[0]+0<=>s[0];
&s[1][0]<=>&*(s[1]+0)<=>s{1]+0<=>s[1];
&s[2][0]<=>&*(s[2]+0)<=>s[2]+0<=>s[2];
...
&s[i][0]<=>&*(s[i]+0)<=>s[i]+0<=>s[i];
...
二维数组的“一维表现形式”正好对应那一行首地址。

3. int a[M][N],i,j;/*设i取值范围:[0,M),j的取值范围:[0,N),a[i][j]有一下几种合法表达式:
1) a[i][j]
2)*(a[i]+j)
3)*(*(a+i)+j)
4)(a[i])[j]
(*(a+i))[j]
4. 嵌套过程如下(基础:    a[i]<=>*(a+i)    ),
*(a+i)[j]
<=>*((a+i)[j])<=>*(*(a+i +j))<=>*(*(a+i+j)<=>*(*(a+(i+j)))<=>*(a[i+j])<=>*(a[i+j]+0)<=>a[i+j][0]


新手刚到,很高兴和大家相互交流,共同进步,不足之处多多指点。
2013-07-26 08:52
快速回复:请教:二级指针怎么和一个二维数组关联起来
数据加载中...
 
   



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

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