CPP中的指针,关于示例程序的混淆

时间:2015-11-18 10:08:20

标签: c++ pointers

通过加速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是由&#39;分隔的单个字符。由&#34;分隔的单个或多个字符;对我来说是一个字符串。
  2. 我理解指针的方式是它们是表示对象地址的值,尽管这会被初始化为int* p=&x;。它们的优点是能够像迭代器一样使用(种类)。但我真的不知道这里发生了什么,我们声明一个指针字母,它被分配给一个值数组(而不是地址),这是什么意思?这样做的原因是什么?
  3. 我知道java中的static是什么,CPP中的含义是什么?作者写道,这意味着编译器只会初始化一次静态值。但是,某个范围内的每个变量都没有完成吗?我在调试中注意到我第一次执行它后似乎跳过了值。但这意味着即使在我的程序运行完毕后,这些静态值仍然会被保存?这对我来说似乎不合逻辑。

4 个答案:

答案 0 :(得分:4)

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

对于第三个问题,letters的含义是不同的,具体取决于您声明变量的范围。在全局范围内使用时,它是链接说明符,表示变量(或函数)不会从translation unit导出。如果在本地范围内(即在函数内)使用变量,那么将在函数的调用之间共享变量,即对函数的所有调用将具有相同的变量,并且在调用之间保持它的值。将类成员声明为static意味着它在类的所有对象实例之间共享。

答案 1 :(得分:3)

1)这里

with latest as (
  select
    id, month, payment, rev,
    max (rev) over (partition by id, month) as max_rev
  from table1
)
select sum (payment)
from latest
where rev = max_rev

static const char* const letters[] = (...) 实际上是const字符的const指针数组。因此,“”。

2)如上所述,上面的变量是指针数组。所以每一个 数组中的元素将地址保存到字符串文字 在数组中定义。所以letters保存内存地址 其中存储“A +”。

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

答案 2 :(得分:2)

  

static const char * const letters []

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

  

const ... const

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

  

静态

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

链接:

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

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

答案 3 :(得分:2)

  1. 这些不是字符而是字符串,因此您的理解是正确的。这里的字母不存储为char,而是以const char *。

  2. 的形式存储
  3.   

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

  4. 那些不是指针字母而是文字字符串,&#34; a&#34;是一个文字,它的类型是const char [],它衰变为const char * - 这意味着它是一个poitner。

    3

      

    我知道java中的static是什么,CPP中的含义是相似的

    总的来说是的,但是存在差异 - 就像你在c ++中使用静态内部函数一样,你也可以在c ++中使用全局静态变量。

      

    作者写道,这意味着编译器只会初始化一次静态值。但是,某个范围内的每个变量都没有完成吗?

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

      

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

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