2

好的,所以根据我对阅读指针数组的理解:

数组被认为等同于常量指针,因为它指向它的每个索引元素。指向数组的指针也等同于第一个索引的地址。

好吧 - 因为这是有效的:

int test[] = {1, 2, 3}

int * point = test;

cout << test + 2; //gives the address of the 3rd element test[2]

我想知道,这怎么会有不同的行为?

char arr[] = "testing pointer arrays";
char * pointer = arr;
cout << pointer + 3 << endl; //would output the actual string at pos arr[3]

同样:

char * test = "zomg";
cout << test + 2; //outputs mg

在这种情况下,char 指针真的很特别吗?这给我带来了另一个关于流式传输函数的问题,您可以通过增加点和指定大小来指定可以写入/读取的字节数(例如 in ofstream::write(char pointer, size);)此外,将结构类型转换为字符指针可以将其转换为字节数组吗?

任何澄清将不胜感激,谢谢。

4

3 回答 3

2

这个

char arr[] = "hello";

相当于

char arr[] = {'h', 'e', 'l', 'l', 'o', '\0'};

唯一的区别是字符串文字的含义,例如"hello",而不是char与其他内置类型的数组相比的数组的处理方式。

接下来,当您将 a 传递char*std::cout

std::cout << pointer + 3 << endl;

您受益于ostream& operator<<for有一个特殊的重载char*,它将指针视为以空字符结尾的字符串的第一个元素。

于 2013-05-26T14:58:59.660 回答
1

发生这种情况是因为在 C 中(由于历史原因,在 C++ 中也是如此),在大多数情况下,指向 char 的指针被认为是指向以字符结尾的字符序列的指针NUL(写为'\0')。

因此,例如,如果您有一个接受 an 的 C++ 函数,std::string您还可以传递一个指向 char 的指针,因为该语言假定您想要从 C 字符串(即以 终止的字符序列NUL)和标准 C++ 字符串进行隐式转换。

输出运算符的作用相同,因此在发送test+2时假定您确实想从那里开始输出 C 字符串。

于 2013-05-26T15:09:20.003 回答
0

它指向它的每个索引元素。

您忘记了有关数组的重要内容,它们是一种数据结构,可以在内存中的连续区域中分配,并且每条记录都包含相同类型的数据。考虑到数组的定义,您真正需要知道的唯一一件事是数组从哪里开始以及何时结束,您不需要指向数组中的每条记录,因为您可以确定它会在任何给定数组的开始和结束。

你的例子

int test[] = {1, 2, 3}

int * point = test;

cout << test + 2; //gives the address of the 3rd element test[2]

它只是向您展示了这一点,但对于初学者来说却以一种更神秘的方式。

test是一个未指定大小的数组[],但它有一个有限的元素列表,因此编译器足够聪明,可以为test3 个元素(3 个 int)分配空间,然后test创建数组。

int * point = test;在这里,您有一个指向数组第一个元素的测试,或者换句话说,您的数组从哪里开始point它是一个指向 int 的指针,而地址正是您可以提供给指针的地址,所以这里没有错误但请记住,您在这里使用数组的标签传递数组的起始地址test

换句话说test[0],为您提供数组中第一个值的值,test为您提供整个数组的地址。

test + 2所以你知道test它只是一个地址的占位符,现在你只是添加 2,结果是你跳过了 2 个位置,你会直接到第三个值的位置,但总是在内存中的地址方面,而不是就存储的价值而言。

最后一个操作是指针算术的一个例子,它基本上是一个用简单数字完成的逻辑操作,事实上,由于数组只是内存中的一个连续块,你可以只计算 +1 或 -1 来达到下一个或以前的值,您的问题是数组没有真正的边界检查,因此您甚至可以向上或向下如此多地到达作为其他内容的一部分的内存地址。

有一个关于指针算法的简单例子

#include <stdio.h>

int main()
{
  int k[] = {34,765,23,5,7,123,8,99};
  int j = 3;

  printf("\nfirst print is  %d \n",k[j]);
  printf("\nsecond print is %d \n",j[k]);

  return(0);
}

这就是你需要知道的关于指针算法的全部内容,记住没有自动边界检查,一切都在你手中!

于 2013-05-26T15:16:12.353 回答