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"和一些混乱.但它应该是一个记忆地址!我的问题是,为什么不解决呢?
想想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只是复制的第一个字符指出通过p对q,它不能改变地址q-其地址是不变的.For cout << &q- operator << (ostream&, char* p)期望p指向NULL终止字符串 - 并&q指向包含"H"但不知道这个字符后面的内容 - 所以你会在屏幕上得到一些垃圾.使用cout << q打印单个字符.