【问题标题】:Pointers in CPP, confusion regarding an example programCPP 中的指针,关于示例程序的混淆
【发布时间】:2015-11-18 10:08:20
【问题描述】:

通过加速 C++ 工作。有一个例子,我有很多不明白的地方。

double grade = 88;

static const double numbers[] = { 97,94,90,87,84,80,77,74,70,60,0 };

static const char* const letters[] = { "A+","A","A-","B+","B","B-","C+","C","C-","D","F" };

static const size_t ngrades = sizeof(numbers) / sizeof(*numbers);

for (size_t i = 0;i < ngrades;++i) {
    if (grade >= numbers[i]) {
        cout << letters[i];
        break;
    }
}
  1. 我不明白static const char* const letters[] = (...) 发生了什么。首先,我一直认为 char 是由 ' 分隔的单个字符。由 " 分隔的单个或多个字符对我来说是一个字符串。
  2. 我理解指针的方式是,它们是表示对象地址的值,尽管它会被初始化为int* p=&amp;x;。它们的优点是能够像迭代器(某种)一样使用。但我真的不明白这里发生了什么,我们声明了一个指针字母,它被分配给它一个值数组(不是地址),这是什么意思?这样做的原因是什么?
  3. 我知道java中的static是什么意思,CPP中的意思类似吗?作者写道,这意味着编译器只会初始化一次静态值。但这不是对特定范围内的每个变量都完成的吗?我在调试中注意到我似乎在第一次执行后跳过了这些值。但这意味着即使在我的程序完成运行后这些静态值仍然保存?这对我来说似乎不合逻辑。

【问题讨论】:

    标签: c++ pointers


    【解决方案1】:

    关于您的第一个问题,字符串文字(例如 "A+")是一个(只读)字符数组,并且作为所有数组,它们可以衰减为指向其第一个元素的指针,即指向 char 的指针.变量letters 是一个常量指针数组(数组中的指针不能改变)指向常量字符。

    对于第三个问题,static 的含义取决于您在哪个作用域中声明变量。在全局作用域中使用时,它是一个 linkage 说明符,表示变量(或函数)不会从translation unit 导出。如果用于局部范围内的变量(即在函数内部),则变量将在函数的调用之间共享,即对函数的所有调用将具有相同的变量,其值在调用之间保持不变。将类成员声明为 static 意味着它在类的所有对象实例之间共享。

    【讨论】:

    • 但不应该是字母[0]然后只是'A'而不是完整的“A+”,因为指针只会查看{'A','+'的第一个元素,'\0'} ?我知道这不会发生,但我不明白为什么不会。
    • @Nimitz14 letters 是指向char指针数组,而不是char 的数组。这让一切变得不同。 letters[0] 是指向字符串文字 "A+"指针。确实,指针是指向第一个字符的指针,但它是指向整个字符串的指针。要获取第一个元素的第一个字母,您需要执行letters[0][0]。我认为您需要找到一本关于指针和数组、它们如何工作以及如何使用它们的书或教程。
    【解决方案2】:

    1) 这里

    static const char* const letters[] = (...)
    

    letters 实际上是指向 const 字符的 const 指针数组。因此是“”。

    2) 如上所述,上面的变量是指针数组。所以每个 数组中的元素保存字符串文字的地址 在数组中定义。所以letters[0] 持有内存地址 存储“A+”的位置。

    3) static 在 C++ 中有多种用途。在你的情况下,如果它在里面声明 函数,它的值在对该函数的连续调用之间保留.. 更多 details.

    【讨论】:

    • 这段代码必须在函数内部(由于for循环),所以static有不同的含义。
    • 但不应该是字母[0]然后只是'A'而不是完整的“A+”,因为指针只会查看{'A','+'的第一个元素,'\0'} ?我知道这不会发生,但我不明白为什么不会。
    • @Nimitz14:与 C 字符串相同。如何在 C 中声明字符串? char * str =“测试”对吗?这里也是类似的。你只有字符串数组
    【解决方案3】:
    1. 那些不是字符而是字符串,所以你的理解是正确的。这里的字母不是以char形式存储的,而是以const char*的形式存储的。

    2. 我们声明一个指针字母,它被分配给它一个值数组(不是地址)

    那些不是指针字母而是文字字符串,“a”是文字,它的类型是 const char[],它衰减为 const char* - 这意味着它是一个指针。

    3.

    我知道java中的static是什么,在CPP中是不是意思差不多

    一般来说是的,但是有一些区别——比如你不能在 java 中使用静态函数,而你可以在 c++ 中使用,你也可以在 c++ 中使用全局静态变量。

    作者写的意思是编译器只会初始化一次静态值。但这不是对特定范围内的每个变量都进行的吗?

    将在堆栈上创建非静态变量,并在每个函数运行时默认初始化(如果没有进行显式初始化)。另一方面,静态变量只会在第一次运行时被初始化。

    但这意味着即使在我的程序运行完成后,这些静态值仍然保存?

    那不是真的,程序完成后,它们被释放 - 你的进程已经死了

    【讨论】:

      【解决方案4】:

      静态常量字符*常量字母[]

      这是一个指向字符的指针数组。在这种情况下,初始化列表将每个指针设置为初始化列表中指定的每个字符串的第一个字符。

      常量...常量

      指针和指针指向的字符都是常量。

      静态

      如果在函数内部声明,类似于全局,但具有局部范围。

      链接:

      http://msdn.microsoft.com/en-us/library/s1sb61xd.aspx

      http://en.wikipedia.org/wiki/Static_(keyword)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-28
        • 1970-01-01
        • 2023-01-22
        • 1970-01-01
        • 1970-01-01
        • 2010-09-25
        • 2011-09-04
        相关资源
        最近更新 更多