游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3687|回复: 11

指针问题值得一看

[复制链接]

47

主题

145

帖子

3602

积分

论坛元老

Rank: 8Rank: 8

积分
3602
发表于 2004-5-24 20:39:00 | 显示全部楼层 |阅读模式
int a[5]={1,2,3,4,5};
int *pa=a;  <--这里的a就是一层指针,a就是数组的首地址也是第一个元素的地址

int a[2][3]={1,2,3,4,5,6};
int *pa=a;  我想知道的是二围数组里的a是怎么样的一个地址,可以把它看作a={a[0],a[1]};a是a[0],a[1]的首地址,也是a[0]的地址,但a[0]和a[1]里也函有3个元素,故a[0]和a[1]也是地址,那么a就可以看做是地址的地址,是否可以int **p=a; ??
但是编译器却显示错误~~我就想搞懂这个 a是怎么一回事情~~这样有助于曾强我对指针的了解。。
到底该怎么把单独一个a附值??要的是单独一个a。。象1围数组那样:
int a[5]={1,2,3,4,5};
int *pa=a;



谢谢了。。因为指针是C语言的精华!!我不得不搞懂它

3

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2004-5-24 21:47:00 | 显示全部楼层

Re: 指针问题值得一看

int a[2][3]; //a是个2维数组
int**p ;// 是个指向指针的指针

两者意义不一样的..

下面是对的
int (*p)[3] = a;
or
int* p[3];
p[0] = a[0];
.....

201

主题

1437

帖子

1963

积分

金牌会员

Rank: 6Rank: 6

积分
1963
QQ
发表于 2004-5-24 21:48:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

3

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2004-5-24 21:52:00 | 显示全部楼层

Re:指针问题值得一看

楼上的错了吧?

50

主题

992

帖子

1012

积分

金牌会员

Rank: 6Rank: 6

积分
1012
发表于 2004-5-24 22:11:00 | 显示全部楼层

Re:指针问题值得一看

二维数组在内存中是以线性的一维数组形式存在的。指针需要一个数据类型来指出它所指向的数据的宽度。如:int a[2][3]={1,2,3,4,5,6};int *p=(int *)a;此时p指向的数据类型为带符号的整形,数据宽度是4个字节,当使用p[1](等效于p+1)这类的语法时p指针会从原地址一次增加4个字节从而指向下一个int型数据;a是一个二维指针,它指向的是一维数组,数据宽度相当于3个int型,即int (*p)[3] = a;当使用p[1]这类语法时会一次增加3X4个字节。所以**p=a这样的语法行不通,因为*p为一整形,根本就不会有**p存在。

9

主题

30

帖子

30

积分

注册会员

Rank: 2

积分
30
发表于 2004-5-25 13:46:00 | 显示全部楼层

Re:指针问题值得一看

2维数组 a[ ][ ] 可以把 符号a看作是一个指针的指针吗??!!

50

主题

992

帖子

1012

积分

金牌会员

Rank: 6Rank: 6

积分
1012
发表于 2004-5-25 15:23:00 | 显示全部楼层

Re:指针问题值得一看

数组指针里没有分层的概念,a是一个地址(指针),当用a[0]语法时它的a指向类型是一维的数组,当用a[0][1]语法时a指向的类型就发生变化,变成一维数组中元素的类型了。

201

主题

1437

帖子

1963

积分

金牌会员

Rank: 6Rank: 6

积分
1963
QQ
发表于 2004-5-25 21:09:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

5

主题

31

帖子

33

积分

注册会员

Rank: 2

积分
33
发表于 2004-5-26 20:58:00 | 显示全部楼层

Re: 指针问题值得一看

对于二维数组a[m][n]

a   ->  *    *    *  ...  *
a+1 ->  *    *    *  ...  *
a+2 ->  *    *    *  ...  *
...
a+i ->  *    *    *  ...  *

a + i是指向一维数组的指针,它指向i行,它每加1便将跨越一行,即n个元素;
*(a + i)就变成指向元素的指针了,它每加1将只跨越一个元素,如*(a + i) + j指向a[j];
*(*(a + i) + j)便是a[j]了;

二维数组a实质上就是一维数组的数组,它的成员元素a是一个一维数组,C语言中用一维数组的首地址表示

这个一维数组,例如:字符串"palstone"实质上是一个char类型的一维数组,所以才会有这样的定义char *str

= "palstone";这样str便成为一个字符串,即一个一维数组,它表现为这个一维数组的地址,作为数组的地址,

str是一个抽象的概念,*str原则上不代表任何意义,但它却是字符"p"(printf("%c",*str);将显示字符p),原

因是*str和*(str+0)在语法上是等效的,从而str也是这个一维数组的首地址,但它们却具有不同的意义.同样,

既然a是一个一维数组,那么它必是一个一维数组的地址(如str),从而也是这个一维数组的首地址(如str+0).

同样的道理,a是一个二维数组,它的表现形式是这个二维数组的地址,同时也是这个二维数组的首地址,即这个

二维数组第0个元素的地址,亦即一维数组a[0]的地址,同样也是一维数组a[0]的首地址,即一维数组a[0]的第0

个元素a[0][0]的地址,从而**a = **(a + 0) = *(*(a + 0) + 0) = a[0][0].

有了这些概念后,便可以这样写了:

int a[2][3] = {{0,1,2},{3,4,5}}; /*a是一个二维数组,它有两个元素,每个元素都是一个具有3个元素的一维数组*/
int (*p)[3]; /*p是指向具有3个元素的一维数组的指针*/
p = a;  /*这里的实质是p = a + 0;地址和首地址,抽象和具体的区别*/

0

主题

12

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2004-5-27 18:15:00 | 显示全部楼层

Re:指针问题值得一看

呵呵,突然发现有问题,特修改一下帖子:
int b[2][3]={1,2,3,4,5,6};

在经过如上定义数组b后,以后再用b的话,结果如下:
b[0]==1
b[1]==4

而如果把b传递给一个函数的话:如
int fun(int *a[])

那么,此时候,结果如下:
a[0]==1
a[1]==2
a[2]==3
a[3]==4
a[4]==5
a[5]==6
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-7-1 09:30

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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