首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >char和char* (指针)

char和char* (指针)
EN

Stack Overflow用户
提问于 2012-10-14 05:24:02
回答 5查看 81K关注 0票数 12

我想了解指针是如何工作的,所以我创建了这个小程序。首先,我创建了一个p指针,它指向一个char。

第一个问题就是这一点。如果我创建一个指针,它的值是一个内存地址(如果我将它指向一个非指针对象),但在我的例子中它是“哈哈”。为什么在char*中它是这样工作的?以及如何使用cin >> p为其增加价值?

我的第二个问题是,我创建了一个q字符,它具有我创建它时的*p指针的值。但是它的值和地址也是"h“,但是为什么呢?它必须是这个char对象的内存地址!这是没有意义的:D (mingw - gcc)

代码语言:javascript
复制
#include <iostream>

int main() 
{
 /* char *p;
    cin >> p;                      //forexample: haha */

    char * p = "haha";
    char q = *p;
    std::cout << "&q = " << &q << std::endl;   //&q = h
    std::cout << "q  = " <<  q << std::endl;   //q = h

    return 0;
}

更多:如果我首先使用char a100;char *p=a;然后&q = h»ŢĹ分配内存,那么"h“和一些乱码。但它应该是一个记忆地址!我的问题是,为什么不是地址呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-10-14 05:31:27

char* p;看作是内存中的地址。你没有初始化这个指针,所以它没有指向任何东西,你不能使用它。

要始终保持安全:

将指针初始化为零:

代码语言:javascript
复制
char *p = 0; // nullptr in C++11

或者初始化为一些自动的

代码语言:javascript
复制
void foo() {
  char a[100];
  char *p = a;
}

或全局内存:

代码语言:javascript
复制
char a[100];
void foo() {
  char *p = a;
}

或者获取动态内存:

代码语言:javascript
复制
char* p = new char [100];

然后,您可以使用p(如果不为NULL)来读取数据并从p中读取数据...

因为你对operator >> (std::istream&, char* p)的误解。这个操作符期望p指向一些内存(自动的,全局的,动态的--不要紧)--它不会自己分配内存。它只是从输入流中读取字符,直到出现空格,并将其复制到p指向的内存中--但p必须已经指向某个内存。

用于获取char q;的地址。当然,您可以使用q&q的地址,它的类型是char* p。但是&q不同于p,这个q=*p只把p指向的第一个字符复制到q中,不能改变q的地址-它的地址是不变的。对于cout << &q - operator << (ostream&, char* p)期望p指向以NULL结尾的字符串-而&q指向包含"H"的内存,但是没有人知道这个字符后面是什么-所以你会在屏幕上看到一些垃圾。使用cout << q打印单个字符。

票数 11
EN

Stack Overflow用户

发布于 2012-10-14 05:46:13

关于指针,首先要学习并始终记住的是确保为它们分配内存,否则你的程序将无法正常运行。

您的代码实际上应该修改如下以分配内存,以便"cin“可以将用户输入写入到分配的内存中:

代码语言:javascript
复制
int main() {
    char *p = new char[1024];      // allocate memory so cin
    cin >> p;                      //forexample: haha
    char q = *p;
    cout << "&q = " << &q << endl; 
    cout << "q = " << q << endl;   
    return 0;
}

现在,字符指针是指向内存中保存一组字符的位置的变量(不一定是一个字符,可能是多个字符,也可能不是,就像特殊值null的情况那样),而字符变量实际上保存了一个字符(而不是一组字符)。

处理指针时的基本运算符是&(的地址)和*(的值)。&检索变量的地址,所以如果我们有char q;,那么&q就是一个字符指针。另一方面,*检索给定指针处的值,因此如果我们有char *p,那么*p将是内存中p所指向的字符。

现在回到您的示例,内联注释用于说明

代码语言:javascript
复制
int main() {
    // allocate a place of 1024 character in memory
    // and let p points to that place
    char *p = new char[1024];      

    // call cin to read input from the user and save
    // it in memory at the location pointed to by p
    // NOTE: cin would put an extra NULL character 
    // at the end to terminate the string
    cin >> p;                      //forexample: haha

    // Now p would be pointing to a piece of memory like this
    // [h] [a] [h] [a] [\0]

    // use the value at operator to de-reference the pointer
    // p, the result would be a single character which 
    // will be the first character in memory p is pointing at
    char q = *p;

    // printing the value of (the address of q)
    // Note you have a problem here as cout will
    // be handling the memory starting at the address 
    // of q as a string while it is not, so you
    // will get a string starting with "h" and followed
    // by whatever is there in memory by the time of execution
    cout << "&q = " << &q << endl;

    // printing the value of the character q
    cout << "q = " << q << endl; 
    return 0;
}

我希望它能帮上忙

票数 3
EN

Stack Overflow用户

发布于 2012-10-14 05:45:32

你应该有类似这样的东西:

代码语言:javascript
复制
#include <iostream>
using namespace std;

在你程序的顶端。或者可以省略using而参考std::cinstd::cout

代码语言:javascript
复制
int main() {
    char *p;

p是一个指针,但是您还没有初始化它,所以它可以指向任何地方或任何地方。您需要对其进行初始化,例如:

代码语言:javascript
复制
p = new char[100];

..。

代码语言:javascript
复制
    cin >> p;                      //forexample: haha

如果您已经将p初始化为指向某个地方,这是可以的--除了如果您输入了太多的数据,您可能会溢出它所指向的缓冲区。对于像这样的简单测试程序来说,这是可以的,但在实践中,您需要采取措施来避免这种情况。

代码语言:javascript
复制
    char q = *p;
    cout << "&q = " << &q << endl; //&q = h

&q的类型为char*,是指向char的指针。向cout发送一个char*值不会打印指针的值(一个内存地址);它会打印指针所指向的字符串。(尽管我自己运行它时得到了一些奇怪的结果;我可能遗漏了一些东西。)如果要查看指针值,请将其强制转换为void*

代码语言:javascript
复制
count << "&q = " << (void*)&q << endl;

(或者您可以使用C++特定的强制转换;我不确定哪种是最好的。)

代码语言:javascript
复制
    cout << "q = " << q << endl;   //q = h

这里的q只是一个char,所以它将它的值打印为一个字符:h

代码语言:javascript
复制
    return 0;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12877120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档