C语言 假如一个指针指向二微数组。那么 *(*(p+1)+1)对么。为什么先给p加1再取值 再加一

C语言 假如一个指针指向二微数组。那么 *(*(p+1)+1)对么。为什么先给p加1再取值 再加一 再取值却表示数字第一行第一列了。或者 这样表示对么p[1][1]

都对,唯一需要纠正的是p[1][1]表示是第二行第二列,因为c++索引值从0开始。

数组表示法
p[m][n]

指针表示法
*(*(p+m)+n)

其中m为行索引,n为列索引,假设数组类型为int。
p为指向数组首地址,也是第一行的地址,为二级指针,行指针(指针的指针),其指针类型为int (*)[n],因此
p+m:指向m行的地址,如果m为0,就是第一行地址
*(p+m):取m行的首地址(列指针),一级指针,类型为int *, 因此
*(p+m)+n:指向m行n列,如果n为0,则指向m行第一个元素地址
*(*(p+m)+n):取(m,n)中的元素值。

这里容易混淆的是当n为0时,p+m和*(p+m)指向的都是同一个地址,但是区别在于前者为int (*)[n]类型的指针,后者为int *类型的指针。追问

p是指针 加m再用*不就直接取第一行第m个数的值了么。假如我这个值是1000。那么1000+1再取值。不就是1001地址的值了么

追答

所以说容易混淆,p是行指针,是指针的指针(二级指针),取出的值还是指针(一级指针)。

去掉索引m因素,也就是p指向第一行,你这么思考:虽然p指向第一行第一个元素的地址,但p代表一行的数据,而不仅仅指向一个元素,p++是整行递增,你又如何能预期*p取一个元素呢,要知道一行数据包含n个元素,到底取哪个?如果*p取的是第一个元素,那么n-1个元素怎么取?也就是一行中其他元素怎么获得?

所以我们需要一个简单的指针,就是int *类型,因此*p其实不是取元素值,而是将p的类型转换成int *。所以说p+m的类型是int (*)[n],*(p+m)的类型是int *,虽然他们的值都是一个地址,但是类型不同。

追问

也就是说这样用的时候。前面没有定义指针p?

追答

额,p是指针啊,不是说了,类型不同,p是int (*)[n]类型,*p是int *类型。

追问

*(*(p+m)+n) 最外面的*是取值?还是 定义时候的*

追答

*(*(p+m)+n):取(m,n)中的元素值。

看来你对定义和取值还没弄清楚。

定义的时候星号告诉编译器这后面是个指针变量。
比如
int a;
int *p=&a;
意思就是p是个指向整数a的指针变量,p的值是一个a的地址。
*p是取a的值。

但是如果p被定义为数组指针
int (*p)[n]
则*p取的是一级指针。因为p是二级指针,就是指针的指针,就是说p的值是另一个指针的地址。
*(*(p+m)+n)其实就是通过2个指针间接访问元素值,之所以难理解,因为一级指针和二级指针的值一样的,都是一个地址,但他们含义不同,一个代表一行数据,一个代表一个元素,而*p取到的这个指针是隐含的,不需要定义。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-04-16

也许楼主基础已经很好了,我就说点核心的,你的问题的也不想慢慢解析。


指针的加减实根据指针类型偏移的,例如,char *p,char类型指针,p=p+1,表示p在内存偏移了1个字节,int *p,p=p+1,表示偏移了4个字节,结构体同理,也就时说,指针偏移量为sizeof(type),这保正某一个类型的指针加减的时候,指向的地址还是这种类型的首地址,而不是乱指,在结构体中就可以这样操作成员。

pdata=mew(n);//不是c++的new,泛指分配数据 
p=pdata;
for(i=0;i<n,i++){
    get((p+i)->x);//get泛指获取数据的函数。
 }

通过我看过C++和汇编的了解,p[i],就是*(p+i)的意思,用C++的话来说,[]是一种能被重载的运算符。

p若指向char,那么p+i就就是一个字节的偏移,就像一个一个往后指。

p若指向char[n],p+i就是n个字节的偏移,就像一排一排的往下指,指向每排的第一个。


指向指针的指针,指针变量的上一级类型为指针,也就void *也就是4字节,如,char **p,p=p+1,p实际是偏移了指针长度的位置,即4字节的偏移,sizeof(void*)是不行的,这就需要你知道,指针变量是4字节长度。

第2个回答  2014-04-16
首先要了解 C语言中,二维数组的存储结构,但分配好地址后,二维数组的每行的首地址会被提出取来,放到一个一维数组中,如A[ ], 指针指向的地址又此一维数组的首地址。
在对数组序号编排,是从0开始的,不是从1,如a[0][0],等,所以在考虑到地址与序号的对应关系是存在加1,或减1的关系。

~小伙伴,如果你认可我的回答,请点击【采纳为满意回答】按钮~
~手机提问的朋友在客户端上评价点【采纳回答】即可。
~你的采纳是我前进的动力~~

O(∩_∩)O,互相帮助,祝学习进步~
相似回答