2015-11-01 51 views
-5
  1. 考虑下面的代码:2关于指针简短的问题,并引用

    double *pi; 
    double j; 
    pi = &j; 
    pi[3] = 5; 
    

我不明白这怎么可能,我可以在这里进行的最后一行。 余集Pi到j的参考,这是一个双变量,而不是一个双[]变量。那么我怎么可能在它上面执行一个数组命令呢?

  • 考虑下面的代码:

    char *c = "abcdefg"; 
    std::cout << &(c[3]) << endl; 
    
  • 的输出为 “DEFG”。我预计我会得到一个参考的输出,因为我以前&,而是我从小区位置到结束的char *的价值。这是为什么?

    +0

    没有涉及的任何引用,只是指针和地址。 –

    +0

    我建议读一本初学C++书来学习基础知识,这一切都将变得清晰起来。 – mathematician1975

    +0

    你需要先阅读一本好的C++书。这些都是非常基本的问题。 –

    回答

    1

    这里有两个单独的问题。

    1. 指针有时用于指向内存中的数组或缓冲区。因此它支持[]语法。在这种情况下,使用pi[x](其中x不为0)是无效的,因为您没有指向数组或缓冲区。

    2. 流有一个负载指针,将它们视为C风格的字符串,并且不输出它们的地址。这就是你的第二种情况。尝试std::cout << static_cast<const void *>(&(c[3])) << endl;

    0

    指针和数组如影随形的C(有点...)

    pi[3]相同*(pi + 3)。但是,在您的代码中,当您在对象边界外创建指针时,会导致未定义行为。

    也要小心,因为*&是不同的运算符,具体取决于出现的表达类型。

    0
    1. 这是未定义的行为。 C++允许你做你不应该做的事情。

    2. 有用于char*特殊的规则,因为它经常被用来作为一个字符串的开头。如果传递一个char*cout,将打印任何指向字符,当它到达一个“\ 0”停止。

    0

    好了,几个主要的事情在这里:

    1. 指针是它是什么,它指向内存中的位置。因此,如果你喜欢,指针可以是一个数组。

    2. 如果您正在使用指针(有时是危险的)工作,这种复杂的事情。你正在写p,这是一个指向内存位置的指针。所以,即使你没有分配内存,你也可以作为一个数组访问内存并写入它。但是这给了我们你所问的问题。怎么会这样?好吧,简单的答案是你正在访问一个内存区域,你创建的变量完全没有控制权,所以你可能会踩到另一个变量(如果你有其他变量的话),或者只是写在内存中尚未使用。

    我不明白你在第二个问题中问什么,也许你可以解释一点吗?谢谢。

    +0

    指针不能是数组。 –

    +0

    “因此,如果你想(原文如此),指针可以是一个数组。”不遵循。 – juanchopanza

    0

    该代码的最后一行...

    double *pi; 
    double j; 
    pi = &j; 
    pi[3] = 5; 
    

    ...是句法相当于(PI + 3)= 5有一个在一个编译器如何看待双没有差异[]变量和双重变量。

    虽然上面的代码会编译,但会导致内存错误。这里是安全的代码,说明了同样的概念...

    double *pi = new double[5]; // allocate 5 places of int in heap 
    double j; 
    pi[3] = 5; // give 4th place a value of 5 
    delete pi; // erase allocated memory 
    pi = &j; // now get pi to point to a different memory location 
    
    0

    我不明白这怎么可能,我可以在这里进行最后 线。我集合Pi到j的参考

    其实,你设置你的指针 PI,指向内存地址j的

    当你做pi [3]时,你使用一个非数组变量作为数组。虽然有效的C++,但它本质上是危险的。您可能会覆盖其他变量的内存,甚至访问进程外的内存,这会导致操作系统查杀您的程序。

    说到这里,pi [3]意味着你在说“让我从pi的内存位置开始第三位”。所以你没有碰到pi本身,而是一个抵消。

    如果你想使用数组,把他们定义为这样:

    double pi[5]; //This means 5 doubles arrayed aside each other, hence the term "array". 
    

    Appropos阵列,在C++中,它通常是最好不要使用原始阵列,而是使用向量(也有其他类型的容器):

    vector<double> container; 
    container.push(5.25); //"push" means you add a variable to the vector. 
    

    与原阵列的容器,例如作为载体,将保持它的大小在内部,所以如果你已经把5个双打中,你可以调用container.size(),这将返回5有用for循环等。

    关于你的第二个问题,你实际上返回了一个对你的“abcdefg”字符串的子字符串的引用。

    &([3])表示“给我一个字符串,从d开始”。由于c风格的字符串(这是什么char *被称为)在最后添加一个额外的NULL,任何代码将这些作为参数(如cout)将继续阅读内存,直到他们偶然发现NULL(又名0 )。 NULL终止字符串,这意味着它标记数据的结束。

    Appropos,c风格的字符串是行为像一个数组,但实际上没有一个的唯一数据类型。这也意味着它们很危险。我个人从来没有任何需要使用它。我建议使用现代字符串。这些更新的,特定于C++的变量既可以安全使用,也易于使用。像矢量一样,它们是容器,它们跟踪它们的大小,并自动调整大小。观察:

    string test = "abcdefg"; 
    cout<<test.size()<<endl;//prints 7, the number of characters in the array. 
    test.append("hijklmno");//appends the string, AND updates the size, so subsequent calls will now return 15.