在C(指针)

时间:2015-12-16 05:17:40

标签: c++ pointers

我正在学习指针,我尝试了以下程序

#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
char* getword()
{
    char*temp=(char*)malloc(sizeof(char)*10);
    cin>>temp;
    return temp;
}
int main()
{
   char *a;
   a=getword();
   cout<<a;
    return 0;
}

根据我的理解程度,a是指向一个角色的指针,在函数getword()中我返回了temp,我认为它是基础&temp[0]。我认为输出将是我输入的字符串的第一个字符,但我在stdout中得到了整个字符串。这是如何工作的?

5 个答案:

答案 0 :(得分:2)

在C的传统中,char*代表一个字符串。实际上,您程序中的任何字符串文字(例如"hello")的类型都为const char *

因此,cout::operator<<( const char * )被实现为字符串输出。它将输出从给定地址开始的字符,直到遇到字符串终止符(也称为空终止符或'\0')。

如果要输出单个字符,则需要将指针取消引用为char类型。您可以选择以下语法之一:

cout << *a;    // Dereference the pointer
cout << a[0];  // Use array index of zero to return the value at that address

应该注意的是,您提供的代码不是非常C ++。对于初学者,我们通常不在C ++中使用malloc。然后通过稍后不调用free来泄漏内存。内存未初始化并依赖于cin成功(可能不是这种情况)。此外,在获得未定义的行为之前,您只能处理最多9个字符的输入字符串。

也许您应该了解<string>库并开始使用它。

答案 1 :(得分:1)

char*&#34;指向一个角色&#34;是真的。但是,按照惯例,并且因为使用指针没有其他方法可以做到这一点,我们也使用它来指向多个字符&#34;。

由于使用char*几乎始终意味着您正在使用指向C风格字符串的指针,因此C ++流库会为您做出此假设,打印{{ 1}}你的指针指向......和下​​一个......以及下一个......以及下一个直到找到char。这就是它的设计方式。

如果您愿意,可以通过取消引用指针来打印 该字符,以获得实际的NULL

答案 2 :(得分:0)

在您的代码中,std::coutostream并提供char *变量作为operator<<的输入调用特定的运算符函数重载来将字符写入ostream

std::ostream也有一个运算符重载,用于将单个字符写入自身。

我假设您现在知道如何取消引用char*变量,但您应该使用std::string而不是不安全的char*类型。

答案 3 :(得分:0)

std::cout是一个重载的运算符,当它接收到char *作为操作数时,它会将其视为指向c样式字符串的指针,它将打印整个字符串。
如果要打印字符串的第一个字符,请使用

cout << *a;

cout << a[0];

答案 4 :(得分:0)

这是正确的代码

   

    #include  <stdio.h>
    #include  <stdlib.h>

    char* getword()
    {
        char*temp=(char*)malloc(sizeof(char)*10);
        scanf("%s",temp);
        return temp;
    }

    int main()
    {
        char *a;
        a = getword();
        int currChar = 1;
        printf("%c",*(a + currChar));  //increment currChar to get next character
        return 0;
    }