char和char*(指针)

Ibu*_*idu 8 c++ pointers char type-mismatch dereference

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

第一个问题是在这一点上.如果我创建一个指针,它的值是一个memoryaddress(如果我指向一个非指针对象),但这次它在我的例子中是"哈哈".为什么它在char*中以这种方式工作?我怎么能用cin >> p增加它的价值呢?

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

更多:如果我首先使用char a [100]分配内存; char*p = a; 然后&q = h»ŢĹ,所以"h"和一些混乱.但它应该是一个记忆地址!我的问题是,为什么不解决呢?

Pio*_*ycz 8

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

总是安全:
要么将指针初始化为零:

char *p = 0; // nullptr in C++11
Run Code Online (Sandbox Code Playgroud)

或初始化为一些自动

void foo() {
  char a[100];
  char *p = a;
}
Run Code Online (Sandbox Code Playgroud)

或全球记忆:

char a[100];
void foo() {
  char *p = a;
}
Run Code Online (Sandbox Code Playgroud)

或者获得动态记忆:

char* p = new char [100];
Run Code Online (Sandbox Code Playgroud)

然后你可以使用p(如果不是NULL)读取数据并从p读取...


因为你的误会operator >> (std::istream&, char* p).这个操作符期望p指向一些内存(自动,全局,动态 - 无论如何) - 它本身不分配内存.它只是从输入流中读取字符直到空白并将其复制到指向的内存p- 但p必须已经指向某个内存.


为了获取地址char q;.当然,你可以采取的地址q:&q,它的类型是char* p.但是&q是不同的p,这q=*p只是复制的第一个字符指出通过pq,它不能改变地址q-其地址是不变的.For cout << &q- operator << (ostream&, char* p)期望p指向NULL终止字符串 - 并&q指向包含"H"但不知道这个字符后面的内容 - 所以你会在屏幕上得到一些垃圾.使用cout << q打印单个字符.

  • 因为您没有为p分配任何值,甚至0也没有,所以它指向某个随机地址。您将“ haha​​”复制到程序中的某些随机存储器中-可能会导致任何情况,这是未定义的行为-甚至可能导致向老板发送一封电子邮件,表明您的工作更好-但这种随机存储器也可能会发生未使用-看来您的程序运行正常。 (2认同)