关于指针和参考文献的两个简短问题

two short questions about pointers and references

本文关键字:两个 问题 参考文献 于指针 指针      更新时间:2023-10-16
  1. 考虑一下这个代码:

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

我不明白我怎么可能在这里表演最后一句。我将pi设置为j的引用,j是一个双变量,而不是双[]变量。那么我怎么可能在上面执行数组命令呢?

  1. 考虑一下这个代码:

    char *c = "abcdefg";
    std::cout << &(c[3]) << endl;
    

输出为"defg"。我预计我会得到一个参考输出,因为我使用了&,但我得到了从单元格位置到末尾的char*的值。为什么?

这里有两个单独的问题。

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

  2. 流具有char指针的重载,以将它们视为C样式字符串,而不输出它们的地址。这就是在你的第二个案例中发生的事情。尝试std::cout << static_cast<const void *>(&(c[3])) << endl;

指针和数组在C(有点…)中齐头并进

CCD_ 5与CCD_。然而,在代码中,当您在对象边界外创建指针时,这会导致"未定义行为"。

还要小心,因为*&是不同的运算符,这取决于它们出现在哪种表达式中。

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

  2. char*有一些特殊的规则,因为它经常被用作字符串的开头。如果将char*传递给cout,它将把指向的任何内容打印为字符,并在到达"\0"时停止。

好的,这里有一些主要内容:

  1. 指针就是指针,它指向内存中的某个位置。因此,如果whish,指针可以是一个数组。

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

我不明白你在第二个问题中问的是什么,也许你可以再解释一下?谢谢

此代码的最后一行。。。

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

(pi+3)=5的句法等价物。编译器查看double[]变量和double变量的方式没有区别。

尽管上面的代码会编译,但它会导致内存错误。以下是说明相同概念的安全代码。。。

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

我不明白我怎么可能演到最后行在这里。我将pi设置为j 的参考

实际上,您正在设置指针pi,以指向j的内存地址

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

如果这样说的话,pi[3]意味着你在说"给我从pi的内存位置往下三分之一的插槽"。所以你不是在触摸圆周率本身,而是一个偏移。

如果您想使用数组,请这样声明它们:

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

适当的数组,在c++中,通常最好不要使用原始数组,而是使用向量(还有其他类型的容器):

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

与原始数组不同,容器(如向量)会在内部保持其大小,因此如果您在其中放入了5个双精度,则可以调用container.size(),它将返回5。适用于循环等。

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

&([3])的意思是"给我一个字符串,从d开始"。由于c样式字符串(也就是char*的名称)在末尾添加了一个额外的NULL,因此任何将这些字符串作为参数的代码(如cout)都将继续读取内存,直到它们偶然发现NULL(也称为0)。NULL终止字符串,这意味着它标志着数据的结束。

恰当地说,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.