RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 622172
Accepted
MaximPro
MaximPro
Asked:2020-02-01 21:44:31 +0000 UTC2020-02-01 21:44:31 +0000 UTC 2020-02-01 21:44:31 +0000 UTC

多维数组或固定指针

  • 772

我在代码中四处闲逛,发现了这个:

这是代码:

#include "stdio.h"
void a_f(char str[][0]) /// !!! Если менять правый индекс то программа будет выводить адреса с интервалами которые равны индексу (сейчас это зафиксированно и указатель никак не меняется!)
{
  int i = 4;
  while(i >= 0)
  {
    printf("%s - %p\n", str+i, str+i);
    --i;
  }
}
int main(void)
{
  char a[][10] = {"hello", "world", "again", "repeat", "stop"};
  printf("start:%p\nend:%p\n\n", a, a+4);
  a_f(a);
  return 0;
}

我无法解释它是什么以及为什么?解释一下这是什么动物!我没有在有关数组的各种手册中看到这一点。

c
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Vlad from Moscow
    2020-02-01T22:16:34Z2020-02-01T22:16:34Z

    如果你有一个指向某种类型对象的指针,比如

    T *p = &obj;
    

    为了能够使用此指针进行指针运算或取消引用指针,您需要知道指针指向的对象的大小。换句话说,您需要知道 的值sizeof( T )。

    例如,如果有一个表达式++p,那么问题来了:指针存储的值应该增加多少?显然,经过这个操作,指针必须指向内存中给定对象之后的地方(或者指向数组的下一个元素,如果当前对象是数组的元素),即指针的值必须增加 的值sizeof( obj )。这意味着编译器必须知道指针指向的对象的大小。

    所以对于这个功能

    void a_f(char str[][10]) /// !!! Если менять правый индекс то программа будет выводить адреса с интервалами которые равны индексу (сейчас это зафиксированно и указатель никак не меняется!)
    {
      int i = 4;
      while(i >= 0)
      {
        printf("%s - %p\n", str+i, str+i);
        --i;
      }
    }
    

    使用声明为二维数组的参数调用

    char a[][10] = {"hello", "world", "again", "repeat", "stop"};
    

    声明为数组的函数参数隐式转换为指向数组元素的指针。反过来,参数,即二维数组a,被隐式转换为指向其第一个元素的指针。

    这个二维数组的元素又是一个一维数组类型char[10]因此,如果你有一个指向这个二维数组第一个元素的指针,那么为了改变它,让它指向下一个,也就是说,数组的第二个元素,它的值必须增加寻址元素的大小。寻址元素(即一维数组)的大小为sizeof( char[10] ). 该函数必须知道此可寻址数组的大小才能正确执行指针操作。

    所以函数的参数声明为

    void a_f(char str[][10]);
    

    转换为类型

    void a_f(char ( *str )[10]);
    

    即,指向数组元素的指针。

    反过来,作为函数参数给出的数组也被转换为指向其第一个元素的指针。这可以表示如下

    char ( *tmp )[10] = a;
    
    a_f( tmp );
    

    sizeof( char[10]有了关于声明为函数参数的 char ( *str )[10]) 指针指向的对象(即 )大小的信息,该函数可以正确计算表达式str+i,它等于存储在 中的值str,加上等于 的值 i * 10 * sizeof( char )。也就是说,结果,指针str将指向i二维数组的第 - 个元素,其元素大小等于10。这就是指针运算的要点。

    为了更清楚,你可以为二维数组的元素类型引入一个别名,如下所示

    typedef char T[10];
    
    // ...
    
    T a[] = {"hello", "world", "again", "repeat", "stop"};
    

    反过来,函数声明将如下所示

    void a_f( T *str );
    

    或者如何

    void a_f( T str[] );
    

    这两个声明声明了相同的函数。

    因此,指针寻址的对象的大小将等于sizeof( T ),根据引入的别名,它等于sizeof( char[10] )

    • 4

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5