【问题标题】:Two Questions about C pointers关于 C 指针的两个问题
【发布时间】:2015-10-31 20:24:15
【问题描述】:

我有关于指针的问题;一理论一实践。

为什么,当在 C 中声明一个指针时,我必须在 *var 前面加上一个类型。如果指针只是一个包含内存地址的变量,为什么编译器/语言需要比指针更多的信息。 int * 和 char * 有什么区别。这是否意味着 int * 指向某个包含 2-4 字节内存的位置,而 char * 仅包含 1?如果最终它是一个指向某个十六进制数字的变量作为 %p 打印它们的证据,那么我从未读过任何关于类型为何重要的基本推理。

其次,给定这段代码

int t = 10;
int *i = &t;
int *j = i;

--

*i == 10;
*j == 10;

为什么 *j 等于 10 而 **j 等于 10?如果 j 是指向 i 的指针,它是指向 10 的 t 的指针,我不需要双重取消引用变量 j 吗?在 xcode 中编写此代码时,它迫使我使用 *j。

所以这些是我对指针感到困惑的几个例子。

【问题讨论】:

  • 您可以将void *pointer; 用于任何类型的通用指针。编译器需要类型信息,因此它知道指针算法是如何应用的。 (例如sizeof (char) = 1sizeof (int) = 4 等。)
  • 第一个问题谷歌指针算法
  • 每个问题只问一个问题。
  • “我从未读过任何关于类型为何重要的根本原因”。继续阅读。

标签: c pointers


【解决方案1】:

需要数据类型才能知道取消引用指针时要读取多少字节。

int *i = &t;

这里,i 中存储的值是t地址

int *j = i;

所以现在,j 中存储的值就是i 中存储的值,即t 的地址。如果要进行双重取消引用,则需要存储i 的地址。

int **j = &i

【讨论】:

    【解决方案2】:

    为什么编译器/语言需要比指针更多的信息

    仅使用指针,编译器不使用。 void* 类型的意思是“指向任何东西的指针”。

    但是,要使用被指向的值,编译器需要知道被指向的值的类型,以便知道可以用它做什么。取消引用 void* 将导致编译器错误,除非您先将其强制转换为类型化指针。

    其次,给定这段代码

    j 不是指向i 的指针。赋值int *j = i;j 设置为与i 相同的值,这是t 的地址(所以j 现在将指向t)。

    要使j 成为指向i 的指针,您需要将其声明为int **j = &i;

    【讨论】:

      【解决方案3】:

      为什么编译器/语言需要比指针更多的信息。

      这是因为不同的数据类型具有不同的大小,并且需要数据类型的大小来分配内存。

      int * 和 char * 有什么区别。

      int * 是指向 int 的指针,char * 是指向 char 的指针。

      为什么 *j 等于 10 而 **j 等于 10?如果 j 是指向 i 的指针,它是指向 10 的 t 的指针,我不需要双重取消引用变量 j 吗?

      int *j = i; 告诉编译器将j 声明为指向int 的指针并将该指针指向指针i 指向的内存位置。因此j 是一个指向变量t 的指针。

      【讨论】:

        【解决方案4】:

        C 是一种静态类型语言。还有其他语言,例如 JavaScript,它们是动态类型的,您可以将不同类型的对象分配给同一个变量。

        这两种方法各有优缺点,静态类型语言最重要的优点是可以在编译时发现许多错误。

        这是一个设计决定。

        【讨论】:

        • Wikipedia 有一篇关于类型系统的详细文章。
        猜你喜欢
        • 2014-05-13
        • 2023-01-08
        • 1970-01-01
        • 1970-01-01
        • 2011-02-01
        • 2022-01-05
        • 2017-08-10
        • 1970-01-01
        • 2021-10-29
        相关资源
        最近更新 更多