c语言问题

谁能给我分析下指针与一维数组和二维数组的相互关系。
我经常看到S[i]有时是表示地址又有时是表示元素值,有时候我觉得s[m++]前面加一个*才表示元素值可答案有没加。
这些我都是自学的,我想可能是我对指针与数组这一节还没有形成很好的体系,愿大家能帮帮我~~

数组和指针的关系

如果对声明数组的语句不太明白的话,请参阅<<如何理解c和c++的复杂类型声明>>, 数组的数组名其实可以看作一个指针,看下例:

例八:

int array[10]={0,1,2,3,4,5,6,7,8,9},value;

...

...

value=array[0];//也可写成:value=*array;

value=array[3];//也可写成:value=*(array+3);

value=array[4];//也可写成:value=*(array+4);

上例中,一般而言数组名array代表数组本身,类型是int [10],但如果把array看做指针的话,它指向数组的第0个单元,类型是int *,所指向的类型是数组单元的类型即int。因此*array等于0就一点也不奇怪了。同理,array+3是一个指向数组第3个单元的指针,所以*(array+3)等于3。其它依此类推。

例九:

char *str[3]={

"Hello,this is a sample!",

"Hi,good morning.",

"Hello world"

};

char s[80];

strcpy(s,str[0]);//也可写成strcpy(s,*str);

strcpy(s,str[1]);//也可写成strcpy(s,*(str+1));

strcpy(s,str[2]);//也可写成strcpy(s,*(str+2));

上例中,str是一个三单元的数组,该数组的每个单元都是一个指针,这些指针各指向一个字符串。把指针数组名str当作一个指针的话,它指向数组的第0号单元,它的类型是char**,它指向的类型是char *。

*str也是一个指针,它的类型是char*,它所指向的类型是char,它指向的地址是字符串"Hello,this is a sample!"的第一个字符的地址,即'H'的地址。

str+1也是一个指针,它指向数组的第1号单元,它的类型是char**,它指向的类型是char *。

*(str+1)也是一个指针,它的类型是char*,它所指向的类型是char,它指向"Hi,good morning."的第一个字符'H',等等。

下面总结一下数组的数组名的问题。声明了一个数组TYPE array[n],则数组名称array就有了两重含义:第一,它代表整个数组,它的类型是TYPE [n];第二,它是一个指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区,注意它和数组第0号单元占据的内存区是不同的。该指针的值是不能修改的,即类似array++的表达式是错误的。

在不同的表达式中数组名array可以扮演不同的角色。

在表达式sizeof(array)中,数组名array代表数组本身,故这时sizeof函数测出的是整个数组的大小。

在表达式*array中,array扮演的是指针,因此这个表达式的结果就是数组第0号单元的值。sizeof (*array)测出的是数组单元的大小。

表达式array+n(其中n=0,1,2,....。)中,array扮演的是指针,故array+n的结果是一个指针,它的类型是TYPE*,它指向的类型是TYPE,它指向数组第n号单元。故sizeof(array+n)测出的是指针类型的大小。

例十:

int array[10];

int (*ptr)[10];

ptr=&array;

上例中ptr是一个指针,它的类型是int (*)[10],他指向的类型是int [10],我们用整个数组的首地址来初始化它。在语句ptr=&array中,array代表数组本身。

本节中提到了函数sizeof(),那么我来问一问,sizeof(指针名称)测出的究竟是指针自身类型的大小呢还是指针所指向的类型的大小?答案是前者,例如:

int (*ptr)[10];

则在32位程序中,有:

sizeof(int(*)[10])==4

sizeof(int [10])==40

sizeof(ptr)==4

实际上,sizeof(对象)测出的都是对象自身的类型的大小,而不是别的什么类型的大小。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2007-08-09
在一维数组中,S[i]表示数组元素,单一个S表示数组名,也是数组首地址(即S[0]的地址)
在二维数组中,S[i]表示“组”的首地址(我实在不知怎么解释),比如有一个二维数组
     S[i][0] S[i][1] S[i][2]
S[0]    1       2       3
S[1]    4       5       6
S[2]    7       8       9
这里面,S[0]也就是第一行的首地址(同时也是整个二维数组的首地址,即元素1的地址),S[1]是第二行首地址(元素4的地址),S[2]是第三行首地址(元素7的地址)。
S[i][0]这一类是元素不是地址。本回答被提问者采纳
第2个回答  2007-08-09
首先你得先搞懂*这个符号的意思,解引用符号,比如指针指向一个整型数据a,int* p = a;这是定义,而对于引用a的值的时候就必须用解引用符号*p,p是a的地址。

现在来看一下它和一维数组的关系
int a[10];这定义了一个十个整形元素的数组,a就是它的首地址,等价于&a[0],a+1即a[1].
int* p; p = a 定义一个指针指向p,由于前面讲的a已经是地址,所以就不必在a前再加&.这样的话,对于解引用操作*p就是a[0]了 *(p+1)就是a[1]了.

再来看二维数组:
int a[10][10];
int* p = a;
这里的a仍然表示地址 , 与一维数组不同的是他表示的是a[0][0],这样一来,你可以自己推一下*(p+1)表示什么……

它表示p[1][0]的地址而不是它的值! 因为它是二维数组,用一个解引用符号仍然表示二维数组高维的首地址.那要引用到具体数组中的元素应该怎么办呢?用两个解引用操作符:
*(*(p+1)+1) 表示什么?

它表示p[1][1]

这就是指针和数组的关系

参考资料:C++ PRIMER & 自己

第3个回答  2007-08-09
一维数组a[10]:a表示数组首地址,数组第一个值可以表示为*a,a[0]