将字符串理解为C 中的指针

Understanding strings as pointers in C++

本文关键字:指针 字符串      更新时间:2023-10-16

我有麻烦将字符串视为指针。显然,字符串被理解为指向字符串第一个地址的指针。因此,使用"&" - 运算符我应该收到字符串的第一个字符的地址。这是一个小例子:

#include "stdafx.h"
#include <iostream>
using namespace std;
int main(){
    char text[101]; 
    int length;
    cout << "Enter a word: ";
    cin >> text;
    length = strlen(text);
    for (int i = 0; i <= length; i++) {
        cout << " " << &text[i];
    }
    return 0;
}

输入诸如" Hello"之类的单词时,输出为:" Hello Ello llo lo o"。相反,我希望收到每个字符的地址" Hello"。当我使用铸件long(&text[i])时,它可以很好地工作。但是我不明白为什么。没有演员,显然是"&amp;" - 运营商给出了要打印的字符串的起始地址。使用铸件,它可以分别提供每个字符的地址。也许是SB。可以向我解释这一点 - 我真的很感激!

&text[i]等于 text + i,并且使用 pointer arithmetic 将指针沿char[]数组沿CC_4数组转移。效果是在第(i)个字符上启动cout<<const char*的过载。从起点到nul末端的所有字符。

text[i]char类型,<<char的过载被调用。输出一个字符。

在C 中,如果您想要一个字符串,请改用std::string。如果textstd::string类型,您仍然可以编写cin >> text;!然后,您的代码也不容易限制您的char缓冲区。

如果您有一个字符数组存储字符串,例如

char text[] = "Hello";

然后将数组像

初始化
char text[] = { 'H', 'e', 'l', 'l', 'o', '' };

在此语句中

std::cout << text;

使用的operator <<用于类型const char *,并且数组text被隐式转换为指针转换为其第一个元素。

你可以写

std::cout << &text[0];

因为在两个语句中表达式text&text[0]具有类型char *

类型const char *的操作员从指针处的地址开始输出字符,直到遇到零字符为止。

所以如果代替语句

std::cout << &text[0];

你会写

std::cout << &text[1];

那么,唯一更改的是字符串的起始地址,仅此而已。实际上,您正在输出如

表示的字符串
{ 'e', 'l', 'l', 'o', '' }

如果写

std::cout << &text[2];

是,如果表达式的右侧指针移动一个位置,则意味着您将处理字符串

{ 'l', 'l', 'o', '' }

等等。

那是

operator <<
template<class traits>
basic_ostream<char, traits>& operator<<(basic_ostream<char, traits>&,
const char*);

仅输出由第二个参数指向字符串的实体。

如果要输出指针本身的值,而不是指针指向指向的字符串,则应使用另一种超载的operator <<,如

basic_ostream<charT, traits>& operator<<(const void* p);

tp调用它,你应该写

std::cout << ( void * )text;

std::cout << ( void * )&text[i];

其中 i是一些索引。

而不是C铸件,您可以使用C 铸件,例如

std::cout << static_cast<void *>( &text[i] );

要打印数组元素的地址,您可以做:

cout << " " << (void*)&text[i];

这个:

cout << " " << &text[i];

等效于此:

cout << " " << text + i;

这意味着您要求打印字符串,从索引i