我正在学习指针,我尝试了以下程序
#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
中得到了整个字符串。这是如何工作的?
答案 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::cout
是ostream
并提供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;
}