【问题标题】:Char and double pointers declaration字符和双指针声明
【发布时间】:2019-03-01 16:13:19
【问题描述】:

我从 C 编程语言开始,我对指针的初始化有疑问。我知道当我们声明一个指针时,我们正在为特定指针保留内存,但是这个指针可能指向我们不知道的 x 地址,关键是我可以这样做: char * s = "Hi"; 但我不能这样做 double * f = 3; 所以我要“初始化”这个双指针是下一段代码:

double * d;
double x = 3;
d = &x;

这样我就可以将指针指向一个特定的内存位置,并具有我想要的初始值。

总结一下,我的疑问是:

1.- 有没有办法像 char 一样初始化 double/int 指针?

【问题讨论】:

  • 我认为你能做的最好的就是在x的声明之后声明指针。然后,您可以在声明时初始化指向&x 的指针,例如double *d = &x;
  • @TomKarzes 你知道为什么我写的 char 指针初始化有效吗,char * s = "Hi";double * f = 3; 不行?
  • 字符串常量(在该上下文中)实际上是其元素类型为char 的数组。例如,"abc" 的类型为 char [4](第四个字符是终止空字符)。与类型为int 的字符常量'a' 进行比较。
  • @TomKarzes 所以如果我理解正确,我为使用 char 指针初始化字符串而编写的语法是 C 的“特殊”语法,以便不初始化字符数组并初始化该数组将包含字符串的字符
  • 字符串声明基本上是在做指针赋值。在该上下文中,字符串常量降级为char *。您可以将这些视为作业。您可以将一个指针分配给另一个指针,或者将数组分配给指针(在这种情况下,数组降级为指针),但您不能将整数分配给指针。如果您可以编写{3.0} 并让它隐式创建一个初始化为{3.0}double [1] 数组,那么这将起作用,但C 仅在用于初始化数组时支持它。字符串常量在这方面是特殊的。

标签: c pointers


【解决方案1】:

可以,但您通常不应该:

double *x = (double []) {3};

正如char *x = "Hi"; 创建一个char 数组并初始化x 以指向该数组的第一个成员,上面的代码创建一个double 数组并初始化x 以指向其第一个成员. (我只展示了一个元素,但你可以写更多。)这称为复合文字。

一个重要的区别是字符串文字的生命周期是程序的整个执行过程,因此您可以安全地从函数返回其地址。相反,函数内部的复合字面量仅在函数执行时才存在,因此无法从函数返回其地址。如果此定义出现在函数之外,则复合文字将存在于程序的整个执行过程中。

复合字面量有时很有用,但如上所示,最好初始化指向复合字面量地址的指针的情况非常有限。应谨慎使用此类代码。

【讨论】:

    【解决方案2】:

    您可以做的最好的事情是使用数组而不是原始指针。由于数组在几乎每个用例中都会降级为指针,因此它的行为大致如您所愿。

    double d[] = {3};
    

    将分配空间(全局或堆栈上,取决于它是在全局范围内还是在函数范围内执行)并立即对其进行初始化。对于几乎所有目的,引用d 会导致它降级为double*

    主要区别在于,对于堆栈分配的数组(函数范围,没有static 限定符),数组只存在到函数调用结束。将其声明为 static double d[] = {3}; 将使其在程序的整个生命周期内都有效,但它只会进行一次初始化,并且任何更改都将无限期地持续下去。

    另一个重要的区别是你不能修改地址,因为它真的不是一个指针; ++d 不合法,因为 d 是一个数组,而不是一个指针。

    对于 char *s = "Hi"; 的完全等价物,您基本上被困在了两行。该代码大致相当于:

    static char unnamed[] = {'H', 'i', '\0'};
    char *s = unnamed;
    

    这是 C 字符串文字的一种特殊行为,没有其他类型有直接的语言支持。用double 精确地模仿它总是有两条线:

    static double dstorage[] = {3};
    double *d = dstorage;
    

    【讨论】:

      猜你喜欢
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多