我想了解指针是如何工作的,所以我创建了这个小程序。首先,我创建了一个p指针,它指向一个char。
第一个问题就是这一点。如果我创建一个指针,它的值是一个内存地址(如果我将它指向一个非指针对象),但在我的例子中它是“哈哈”。为什么在char*中它是这样工作的?以及如何使用cin >> p为其增加价值?
我的第二个问题是,我创建了一个q字符,它具有我创建它时的*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;
}更多:如果我首先使用char a100;char *p=a;然后&q = h»ŢĹ分配内存,那么"h“和一些乱码。但它应该是一个记忆地址!我的问题是,为什么不是地址呢?
发布于 2012-10-14 05:31:27
将char* p;看作是内存中的地址。你没有初始化这个指针,所以它没有指向任何东西,你不能使用它。
要始终保持安全:
将指针初始化为零:
char *p = 0; // nullptr in C++11或者初始化为一些自动的
void foo() {
char a[100];
char *p = a;
}或全局内存:
char a[100];
void foo() {
char *p = a;
}或者获取动态内存:
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打印单个字符。
发布于 2012-10-14 05:46:13
关于指针,首先要学习并始终记住的是确保为它们分配内存,否则你的程序将无法正常运行。
您的代码实际上应该修改如下以分配内存,以便"cin“可以将用户输入写入到分配的内存中:
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所指向的字符。
现在回到您的示例,内联注释用于说明
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;
}我希望它能帮上忙
发布于 2012-10-14 05:45:32
你应该有类似这样的东西:
#include <iostream>
using namespace std;在你程序的顶端。或者可以省略using而参考std::cin和std::cout。
int main() {
char *p;p是一个指针,但是您还没有初始化它,所以它可以指向任何地方或任何地方。您需要对其进行初始化,例如:
p = new char[100];..。
cin >> p; //forexample: haha如果您已经将p初始化为指向某个地方,这是可以的--除了如果您输入了太多的数据,您可能会溢出它所指向的缓冲区。对于像这样的简单测试程序来说,这是可以的,但在实践中,您需要采取措施来避免这种情况。
char q = *p;
cout << "&q = " << &q << endl; //&q = h&q的类型为char*,是指向char的指针。向cout发送一个char*值不会打印指针的值(一个内存地址);它会打印指针所指向的字符串。(尽管我自己运行它时得到了一些奇怪的结果;我可能遗漏了一些东西。)如果要查看指针值,请将其强制转换为void*
count << "&q = " << (void*)&q << endl;(或者您可以使用C++特定的强制转换;我不确定哪种是最好的。)
cout << "q = " << q << endl; //q = h这里的q只是一个char,所以它将它的值打印为一个字符:h。
return 0;
}https://stackoverflow.com/questions/12877120
复制相似问题