【问题标题】:Pointers and arrays reference in CC中的指针和数组引用
【发布时间】:2018-10-21 07:04:26
【问题描述】:

课本里面有一些代码和解释

#include <stdio.h>

typedef int *byte_pointer;
void show_bytes(byte_pointer start, size_t len){
int i;
for(i=0; i<len; i++)
    printf(" |%.2x",start[i]);
printf("\n");
}

void show_int(int x){
show_bytes((byte_pointer) &x, sizeof(int));
}

它说引用 start[i] 表示我们要读取 i 位置 超出 start 指向的位置的字节。

(例如 int 类型)指针具有 int 类型(4 字节)是否正确,因此它读取 4 字节(例如地址 0x100~0x103)或数据结尾 即使我们只是给出一个起点地址(例如0x100)?我说的对吗?

【问题讨论】:

  • 我什么都不懂。请不要 typedef 指针。
  • 如果此代码是从您的教科书中逐字提取的,您应该要求退还您的学费。
  • int 不是一个字节。除了混淆代码之外,typedef 还在对阅读它的人撒谎。

标签: c arrays pointers reference memory-address


【解决方案1】:

在您的代码中,start[i] 获取内存单元 start + sizeof(int) * i 的值,这很可能不是您(或教科书的作者)想要的。

你必须替换

typedef int *byte_pointer;

通过

typedef unsigned char *byte_pointer;

然后start[i] 给你start 之后的第i 个内存单元,因为sizeof(unsigned char) == 1

【讨论】:

    【解决方案2】:

    这个例子的名字不合适。 指针的算术是由指针设置的元素类型的大小来完成的。 如果指针是:

    类型* ptr;

    然后每个 ptr[i] 将把你放在指针指向的位置加上 i*(sizeof(type));

    type 可以是 char、int、long、size_t 等。这取决于您指向的数据类型。例如,如果您指向 char 数组 - sizeof(char) 是一个字节。所以要到达第二个元素,您需要到达 init。位置并移动一个字节以读取一个字节的数据,这是第二个元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 2015-09-07
      • 2023-03-11
      • 1970-01-01
      • 2015-04-21
      • 2017-05-10
      • 2013-03-10
      相关资源
      最近更新 更多