C语言、二维数组指针中的 * 和 &我看的是谭的那本C,有书的可以翻下吧(没书的看我的叙述吧),244、245页,看的我很迷茫啊1、对于二维数组a[3][4], a+i 和 *(a+i) 怎么会是一样的呢?书上的那

来源:学生作业帮助网 编辑:六六作业网 时间:2024/12/21 11:31:09
C语言、二维数组指针中的*和&我看的是谭的那本C,有书的可以翻下吧(没书的看我的叙述吧),244、245页,看的我很迷茫啊1、对于二维数组a[3][4],a+i和*(a+i)怎么会是一样的呢?书上的那

C语言、二维数组指针中的 * 和 &我看的是谭的那本C,有书的可以翻下吧(没书的看我的叙述吧),244、245页,看的我很迷茫啊1、对于二维数组a[3][4], a+i 和 *(a+i) 怎么会是一样的呢?书上的那
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]的,所以才有这个疑问)
恳请大家帮助回答一下,或者我说的有什么不对的地方帮忙指出一下,谢谢了~~

C语言、二维数组指针中的 * 和 &我看的是谭的那本C,有书的可以翻下吧(没书的看我的叙述吧),244、245页,看的我很迷茫啊1、对于二维数组a[3][4], a+i 和 *(a+i) 怎么会是一样的呢?书上的那
要回答你的这个问题,不妨先根据你的问题先编写一段小的示例程序:
#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]在数值上相等.当然,此处仍非等价关系.
至于指向行的指针,所指的就是指向行首位置的指针量.
至于你的最后一个问题,正如我刚才一直强调的那样,等号两端仅仅是数值上的相等,而非等价关系,因此无法按照你所设想的方式进行归纳推导.

C语言、二维数组指针中的 * 和 &我看的是谭的那本C,有书的可以翻下吧(没书的看我的叙述吧),244、245页,看的我很迷茫啊1、对于二维数组a[3][4], a+i 和 *(a+i) 怎么会是一样的呢?书上的那 用C语言在主函数中定义和初始化一个二维数组a[3][4]和一个指针数组,采用指针数组去访问数组元素a[2][4]; 用C语言在主函数中定义和初始化一个二维数组a[3][4]和一个指针数组,采用指针数组去访问数组元素a[2][4] C语言的指针问题.*(p+i)是代表取值呢还是取地址?有一二维数组a[3][4]={{56,45,89,90},{13,34,56,45},{65,55,34,68}}如果我定义指针*P,指向首地址,*(p+i)就能取到数组中的值.但如果我定义指针(*p)[4],指 c语言中的二维数组a[a][j]可以表述为*(*(a+1)+j),但是我看不懂这个东西啊 C语言中指针引用二维数组元素问题假设a是一个3行4列的二维数组,请问为什么a[0]与*(a+0)是等价的,我的理解是二维数组名a既然是该数组首元素的地址,那么(a+0)也是一个地址,“*(a+0)”就 C语言如何在子函数中对主函数中的二维数组值进行修改?二维数组已经在主函数中用动态数组分配了空间. c语言中,指针于二维数组的问题假设我们引用二维数组a中的元素a[I][J],指针P指向a.书上说引用方法有四种 p[i]+[j] *(*(p+i)+j) (*(p+i))[j]) *(p[i]+j)为什么要弄得这么复杂啊,而且看不懂为什么可以这 C指针问题迷惑中,(*p)[4]和*p到底有什么区别?自学,谭浩强的C语言书,多维数 组指针变量,设有一个二维数组a[3][4],下面是书中原话:“(2)指向由m个元素组成的一维数组的指针变量.上例的指针 C指针问题迷惑中,(*p)[4]和*p到底有什么区别?自学,谭浩强的C语言书,多维数 组指针变量,设有一个二维数组a[3][4],下面是书中原话:“(2)指向由m个元素组成的一维数组的指针变量.上例的指针 关于C语言二维数组指针的疑问定义一个二维数组int a[i][j],由定义可知a=&a[0][0]=a[0],由于a可看成是带有i个一维数组元素的数组,所以由一维数组的情形可推知a[i]=*(a+i)和a+i=&a{i]和a=&a[0],即有a=&a[0] C语言:有一个3*4的矩阵,要求编写求这个二维数组中的最大的那个元素的值,以及所在的行号和列号. 请教C语言一道题目(指针)下列程序完成二维数组a中的最大值和b中最大值之差,请将下列程序补充完整.#include #include float find_max(___________________){ int i,j; float max=**x; for(i=0;i C语言 当两个指针指向同一个数组中的元素时,p-q的物理意义是:指针p和q所指对象之间元素的数量C语言 当两个指针指向同一个数组中的元素时,p-q的物理意义是:指针p和q所指对象之间元素的 求一连连看算法 C 语言给定二维数组A[row+2][col+2],(row*col 一、 判断对错,正确的打“√”,错误的打“×”.(8分,每题1分)1. 指针变量和变量的指针是同一个名词不同说法.( )2. 在C语言中,二维数组元素是按行存放的.( )3. 数组不可以整体赋 C语言中若定义数组和指向数组的指针,其中元素的地址可用哪几种方式表达? c语言中*s++=*p是什么意思*s和*p是指向数组的指针