指针和数组 - c++

Pointers and arrays - c++

本文关键字:c++ 数组 指针      更新时间:2023-10-16

我不知道为什么以下内容在 c++ 中有效

 int main() {
  function("hello world");
     return 0;
 }
 void function(char *ch) {
  cout << ch;
 }

为什么指针指向整个字符串?I thougt 它将被指向数组中的第一个元素。

char*是一种类型。它的值是一个内存地址 - 机器内存的单位。此内存字节中包含的值是一个字符。此地址之外还有更多内存,该地址按顺序包含更多字符。

告诉cout输出char*(而不仅仅是char)告诉它不仅要输出它指向的直接内存地址,还要输出它之外的所有内容,直到值

你是对的。指针指向数组中的第一个元素。但话又说回来,由于ch是类型 char * 并且您尝试cout ch,它会打印直到它在内存中找到

为什么指针指向整个字符串?

因为字符串是一个数组 - 每个字符都在内存位置紧跟在前一个字符之后。因此,指向第一个字符的指针也可以被视为指向整个字符串的指针。

I thougt 它将被指向数组中的第一个元素。

确实如此。但是你可以对它应用指针算法(例如 ch[2] ) 来访问其他元素。当你给它一个指向字符的指针时,<<就是这样做的:它假定它指向一个以零结尾的数组,并打印它找到的所有字符,直到它到达终止符。

请注意,在现代C++中,这不应该编译 - 字符串文字是常量,所以它应该只能转换为 const char * ,而不是char *。较旧的编译器将允许转换,但应发出警告,指出它已被弃用。应始终启用并修复编译器警告。

除了 C++ 中的字符串文字是 const 的问题:

您看到的是 C 中的数组以及 C++ 中的关联传递和处理的正常方式。在大多数情况下,当数组在表达式中传递或使用时,它会"衰减"到指向其第一个元素的指针。所以是的,你是对的:ch 是指向第一个字符的指针。并且围绕 char 数组的所有 C/C++ 例程(也称为 C 字符串)都依赖于以 0 结尾的字符串。在有效内存区域中从给定地址开始的某个地方,值为零的字节必须指示字符串在逻辑上到此结束。例如运算符<<在遇到零字节时将停止从该内存复制到 cout 的字符。像 strcat() 这样的函数只是覆盖那个零字节并附加一个新的,新的、更长的字符串现在"结束"。

背景是 C/C++ 阵列不携带任何"辅助信息"。除了内存中元素的裸序列之外,没有任何与它们关联的数据。

顺便说一句,对于没有可以用作结束标记的"无效"值(如 char 的 0)的类型,函数无法找到传递给它的数组的末尾,因为该函数只获得指向第一个元素的指针。所有这些函数都需要第二个参数来指示数组的长度。这种原始数组处理(当然,在任何机器代码中都非常快速且易于翻译)与具有更安全、更抽象的类型系统(如 Ada 或 C#)的语言非常不同,在 Ada 或 C# 中,数组携带有关其长度的信息。

"hello world"是一个字符数组,你可以声明为:

char* test = "hello world";

其行为类似于:

char test[] = {"hello world"};

C 中的数组可以解释为指针,指针可以指向数组。

我会向你推荐一些关于C指针的文献。