gpt4 book ai didi

指向 char 算术的 C++ 指针

转载 作者:太空狗 更新时间:2023-10-29 20:04:47 26 4
gpt4 key购买 nike

如果我给一个指针加 1,实际添加的值将是指针指向的类型的大小,对吗?例如:

int* num[5];
cout << *num << ", " << *(num + 2) << endl;

这将打印存储在 num[1] 和 num[2] 的值,所以 num + 2 实际上是 num + 2*sizeof(int) 如果我没记错的话。

现在,如果我将指向 char 的指针数组初始化为字符串文字,如下所示:

char* ch[5] = 
{
"Hi",
"There",
"I,m a string literal"
};

这是可以做到的,因为像“hi”这样的字符串文字代表它的第一个字符的地址,在本例中是“h”。现在我的问题是我怎样才能写出这样的东西:

cout << *(ch + 2);

并得到“I,m a string literal”作为输出?由于指针指向 char,因此向指针添加 2 实际上不应该是 (ch + 2*sizeof(char)) 吗?给我输出“那里”?

和cout有关系吗? cout 是否搜索指向值的内存以查看它是否找到'\0'将指向值的内容识别为字符串然后修改指针算法?但是然后将 1 添加到指向字符串的 char 指针将意味着每次添加不同数量的字节(而不是 char 的大小),因为字符串可以是任意大小。还是我完全错了?抱歉,我是 C++ 的新手,而且是普通编程。

最佳答案

数组不存储 char,它存储 char *。因此说 ch + 2 将等同于 ch + 2*sizeof(char *)。然后取消引用它,它指向 "I'm a string literal"

您的初始示例显示了混淆:

int* num[5];
cout << *num << ", " << *(num + 2) << endl;

这是一个指向整数的指针数组。因此,*(num + 2) 将是 *(num + 2*sizeof(int *))不是 2*大小(整数)。让我们用一个小程序来证明这一点:

#include <iostream>

int main()
{
int *num[3];
int x, y, z;
x = 1;
y = 2;
z = 3;

num[0] = &x;
num[1] = &y;
num[2] = &z;

std::cout << *(num + 2) << "\n";
}

这将打印出一个内存地址(如 0x22ff28),因为它保存的是指针,而不是值。

在 C 和 C++ 中,数组和指针非常相似(许多书声称它们完全相同。这不完全正确,但在很多情况下都是正确的)。

您的第一个示例应该是 int num[5]。然后 *(num + 2)(相当于 num[2])将相当于 *(num + 2*sizeof(int)。希望这能在一定程度上消除您的困惑。

关于指向 char 算术的 C++ 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16975094/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com