作业帮 > 综合 > 作业

C语言、二维数组指针中的 * 和 &

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/12 19:48:18
C语言、二维数组指针中的 * 和 &
我看的是谭的那本C,有书的可以翻下吧(没书的看我的叙述吧),244、245页,看的我很迷茫啊
1、对于二维数组a[3][4], a+i 和 *(a+i) 怎么会是一样的呢?书上的那种解释我觉得是在回避这个问题,按照他的说法—— a+1不是一个变量存储单元(这点我认同),就谈不上*(a+i)所指向的内容了.所以*(a+i)不是指向内容的,所以它就是地址了?这种逻辑明显是错的啊.
还有最重要的问题就是谭自始至终没有告诉我们这个“解引用操作符”到底是个什么东西,我知道他是把指针带到它所指向的变量,但是这个定义对二维数组不适用,所以它是错的. 我很想知道这个dereference是什么意思~能从构词法或者其它的什么形象的说说吗?谢谢
2、就是这个&符号的问题了,我觉得跟第一个是一样的,书上有一句话是说,&a[i]
和a[i]是一样的,同理&后面是应该跟一个变量名的,然后用这个来取它的地址,那么这里跟的是一个数组名,怎么理解呢?是不是说把数组名看成一个变量呢?
3、书上所讲的指向行的指针、指向列的指针到底是什么意思呢?看不懂
4、既然a+i=*(a+i),那么,可不可以从数学上推导出:*********(a+i)=(a+i) (任意个星号),如果上述推论是正确的话那么我们怎么得到a[i][0]呢?(我记得好像**(a+i)是等于a[i][0]的,所以才有这个疑问)
恳请大家帮助回答一下,或者我说的有什么不对的地方帮忙指出一下,谢谢了~~
要回答你的这个问题,不妨先根据你的问题先编写一段小的示例程序:
#include
#include
using namespace std;
int a[3][4];
int main(){
memset(a,-1,sizeof(a));
int i;
for( i = 0; i < 3; i++){
printf("&a[i][0] = %d\n",&a[i][0]);
printf("a + i = %d; *(a + i) = %d;\n",a + i,*( a + i));
printf("a[i] = %d; &a[i] = %d;\n",a[i],&a[i]);
printf("\n");
}
}
这段示例程序在我本地上运行的结果为:
&a[i][0] = 4214816
a + i = 4214816; *(a + i) = 4214816;
a[i] = 4214816; &a[i] = 4214816;
&a[i][0] = 4214832
a + i = 4214832; *(a + i) = 4214832;
a[i] = 4214832; &a[i] = 4214832;
&a[i][0] = 4214848
a + i = 4214848; *(a + i) = 4214848;
a[i] = 4214848; &a[i] = 4214848;
我想看到这个运行结果,你已经有所了解了,下面我再详细说一下:
指针量a作为一个二维数组的指针量,其本质是一个“指向指针的指针”(为了方便,下面称其为双重指针),或者你可以理解为a为int**类型的指针量.当a做加减运算时,得到的结果仍然是一个“双重指针”,即a + i是一个双重指针,它是一个指向了原数组第i行的起始位置的双重指针.
而*(a + i)原来的双重指针解引用后得到的一个指针变量,他是一个指向了原数组第i行的起始位置的“单重指针”.
可以看出,a + i和*(a + i)尽管数据类型不同(前者为双重指针,后者为单重指针),但是他们指向同一块内存地址,因此作为指针量,他们的值是相等的.注意,仅仅是说,他们的值在数学上是相等的,并非说“他们是等价的”.
你的第二个问题亦是同理:
首先,[]作为C语言的操作符,本身即具有“解引用”的语义.明白的说,就是a[i]与*(a + i)是完全等价的,而&a[i]即等价于a + i.由于易知a + i和*(a + i)在数值上相当,那么进行等价带花可以知道,&a[i]和a[i]在数值上相等.当然,此处仍非等价关系.
至于指向行的指针,所指的就是指向行首位置的指针量.
至于你的最后一个问题,正如我刚才一直强调的那样,等号两端仅仅是数值上的相等,而非等价关系,因此无法按照你所设想的方式进行归纳推导.