指针打印字符串的第一个字符

问题描述 投票:0回答:2
#include <iostream>

using namespace std;
char* input(char **S);
int main()
{
    char **S = new char *; 
    char *K = input(S);
    //cout << K << endl;
    cout << *K << endl;
}

char* input(char **S)
{
    cout << "Enter string: ";
    cin >> *S;
    cout << S << endl; // Prints address of S
    cout << *S << endl; //Prints content of address stored in S
    return *S;
}

我无法理解为什么当我打印出 *K 时,我只得到输入字符串的第一个字符,但如果我打印出注释行(仅 K )我得到整个字符串。任何帮助解释我无法看到或理解的内容的帮助都会受到赞赏。

c++ pointers char-pointer
2个回答
2
投票

让我们了解数组是如何工作的:

// Let's say I have one character array
char arr[] = {'a', 'b', 'c', 'd'};

在这里,数组的名称,即 arr 充当指向数组第一个元素的指针。但是,请注意,为了避免混淆,它不是指向第一个元素的指针,它只是隐式转换为元素类型的指针。更多详细信息可以在这里找到:https://stackoverflow.com/a/1641963/10821123

现在由于数组是连续的,因此可以确定其余元素。

// so ideally, the below two statements would print the same thing
cout << &arr << endl;
cout << (void*) &arr[0] << endl;
// the above line just takes out the address of the first pointer

现在回答你的问题,我将把我的示例转换为字符串一:

char *K = "abc";

cout << *K << endl; // a
cout << K << endl; // abc

请注意,上面的

char *K = "abc";
分配会给你一个警告:
ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]

指针仅保存数组第一个元素的地址,因此当您取消引用指针时,它会打印第一个元素,即

*K
被解释为
K[0]

现在有

operator <<
的重载,所以它的作用是,如果它看到一个字符指针,即
char*
,它会打印完整的以 null 结尾的字符串,这就是为什么在你的情况下,它也会打印整个字符串。


0
投票

如果我从字符串“s”和保存在指针“p”中的字符串的第一个字符打印地址,为什么地址不同?不应该是一样的吗?我得到相同的字符,但地址不同。

  #include <stdio.h>
  #include <string>
    
    int main()
    {
        std::string s = "hello";
        char *p = &s[0];
        printf("%p\n", s);
        printf("%p\n", p);
    
        printf("%c\n", s[0]);
        printf("%c\n", *p);
    }
© www.soinside.com 2019 - 2024. All rights reserved.