生如夏花133 发表于 2019-9-24 20:32:18

C语言 数组指针

本帖最后由 生如夏花133 于 2019-9-24 20:50 编辑

请问一下,为什么小甲鱼上课内容https://fishc.com.cn/thread-72907-1-1.html中的*(*p2+i)等价于(*p2)?

还有就是*(*p2+i)这个要如何理解?按照优先等级而言,不是应该先看*p2? 即p2指针变量所指的值,然后再加上i,但是为什么前面还有一个*   ?

bin554385863 发表于 2019-9-24 20:44:46

a = *(*(a + i) + j)

生如夏花133 发表于 2019-9-24 20:52:05

bin554385863 发表于 2019-9-24 20:44
a = *(*(a + i) + j)

不好意思,还是不太理解

生如夏花133 发表于 2019-9-24 20:55:20

本帖最后由 生如夏花133 于 2019-9-24 21:12 编辑

bin554385863 发表于 2019-9-24 20:44
a = *(*(a + i) + j)

大概理解了。这应该是硬性规定?

bin554385863 发表于 2019-9-25 12:42:54

本帖最后由 bin554385863 于 2019-9-25 12:49 编辑

生如夏花133 发表于 2019-9-24 20:55
大概理解了。这应该是硬性规定?

不是规定
a一个含有k个元素为a的数组
即二维数组的第一维是第二维的首地址
以此可以得出a = * ( * ( a + k ) + j )

生如夏花133 发表于 2019-10-8 15:50:06

bin554385863 发表于 2019-9-25 12:42
不是规定
a一个含有k个元素为a的数组
即二维数组的第一维是第二维的首地址


不知道我这样的思路是否正确呢?

对于一维数组而言,定义指针p,并指向数组str[],数组元素地址可以用(p+n)或者是(str+n)来表示

对于二维数组a而言,定义指针p,并指向二位数组a,其中a表示不同行元素的首地址,
而a又与*(p+k)等价;确定位于第几行后,再进行地址的移动以确定列元素,即(a+m),等价于(*(p+k)+m)

bin554385863 发表于 2019-10-8 18:55:59

本帖最后由 bin554385863 于 2019-10-8 18:57 编辑

可以那么理解
#include <iostream>
/*
type arr = {......};
type (*p) = arr;
则arr = *(*(p+k)+j) = *(arr + j)
*/
int main(int argc, char const *argv[])
{
    int arr = {0};
    int (*p) = arr;
    for (size_t i = 0; i < 2; i++)
    {
      for (size_t j = 0; j < 2; j++)
      {
            std::cout<<*(*(p + i)+j);
      }
      std::cout<<std::endl;
    }
    std::cout<<std::endl;
    for (size_t i = 0; i < 2; i++)
    {
      for (size_t j = 0; j < 2; j++)
      {
            std::cout<<*(arr + j);
      }
      std::cout<<std::endl;
    }
   
    return 0;
}

生如夏花133 发表于 2019-10-8 23:18:04

bin554385863 发表于 2019-10-8 18:55
可以那么理解

感觉以我目前的水平还看不懂这些,抱歉{:10_266:}

bin554385863 发表于 2019-10-8 23:20:25

生如夏花133 发表于 2019-10-8 23:18
感觉以我目前的水平还看不懂这些,抱歉

{:10_266:}
你把<iostream>换成stdio.h
把std::cout换成printf,那就是C代码了

生如夏花133 发表于 2019-10-9 10:33:41

bin554385863 发表于 2019-10-8 23:20
你把换成stdio.h
把std::cout换成printf,那就是C代码了

好的,谢谢!
一定加强学习,嘻嘻
页: [1]
查看完整版本: C语言 数组指针