-1
int *ab = (int *)5656;
cout << *ab; //Here appcrash.


int *ab;
*ab = 5656;
cout << *ab; //These block crashes the app too.

但是如果我这样写,我可以获得指针内容的十六进制值:

int *ab = (int *)5656;
cout << ab; //Output is hex value of 5656.

所以我想问:* 是一个带来指针内容的运算符(?)但是为什么在这个(这些)示例中应用程序崩溃?

如果我将代码更改为此,我可以使用该运算符:

int a = 5656;
int *aptr = &a;
cout << *aptr; //No crash. 

以及为什么取消引用运算符(*)会带来 char 的唯一第一个字符:

char *cptr = "this is a test";
cout << *cptr; // Here output = 't'
cout << cptr; // Here output = 'this is a test'
4

3 回答 3

9
int *ab = (int *)5656;
cout << *ab; //Here appcrash.

在这种情况下,您将指针设置为指向ab地址 5656。您知道这个地址是什么吗?不,你没有。您是在告诉编译器相信您那里有一个int。然后,当您使用 取消引用指针时*ab,您显然会发现那里不int存在并且您得到未定义的行为。在这种情况下,您的程序会崩溃。

int *ab;
*ab = 5656;
cout << *ab;

在这种情况下,您有一个未初始化的指针ab,然后您取消引用以将 5656 分配给intit 指向的指针。由于它未初始化,因此取消引用它会给您带来未定义的行为。这样想吧。你没有输入地址,ab所以你不知道它指向哪里。你不能只是取消引用它并希望它指向一个int.

int a = 5656;
int *aptr = &a;
cout << *aptr;

这很好,因为您知道您有一个int值为 5656 的对象,并且您知道其中aptr包含该int对象的地址。取消引用完全没问题aptr

const char *cptr = "this is a test";
cout << *cptr; // Here output = 't'
cout << cptr;

(您的代码使用不推荐的转换为char*,因此我将其更改为const char*。)

字符串文字为您提供了一个包含s"this is a test"的数组。const char但是,它随后会进行数组到指针的转换,从而为您提供指向其第一个元素的指针。由于每个元素都是 a const char,因此您得到的指针是 a const char*。然后将此指针存储在cptr.

所以cptr指向字符串的第一个元素。取消引用该指针会为您提供第一个元素,它只是字符串的第一个字符。所以你输出t.

I/O 库有特殊的重载,它接受const char*s 并将其视为指向字符串。如果没有,cout << cptr只需打印出cptr. 相反,这些特殊重载将打印出cptr假定指向的以空字符结尾的字符数组。

于 2013-05-18T15:57:56.370 回答
0

我认为值得注意的是,您观察到的应用程序崩溃是由于您的进程(即程序)不太可能拥有您指定位置的内存:5656。

现代操作系统不允许访问由其他进程分配的内存。

想象一下,如果我们不是这样,那将是多么令人头疼:一个程序可以修改与另一个程序关联的数据!

“访问冲突”消息是一个有用的提示,表明您正在访问您的进程不拥有的内存。

于 2013-05-18T16:07:35.977 回答
0
  • 是一个运算符,它带来了指针(?)的内容

不。 * 是一个运算符,它带来指针指向的内存内容。

这里:

int *ab = (int *)5656;
cout << *ab; //Here appcrash.

指针ab包含 5656。*ab尝试访问指针ab指向的内存 =>*ab尝试访问地址 5656 处的内存。您的程序不允许访问地址 5656 处的内存,因为它未分配或只读 => 应用程序崩溃。

  • 如果我将代码更改为以下代码,我可以使用该运算符: int a = 5656; int *aptr = &a; cout << *aptr; //没有崩溃。

在这里分配和初始化内存:int a = 5656; 在这里,您将先前分配的内存地址写入指针:int *aptr = &a; 在这里您访问先前分配的内存:(*aptr内存包含 5656)。您有权访问它 => 应用程序不会崩溃。

  • 以及为什么取消引用运算符(*)会带来 char 的唯一第一个字符

因为char不是字符串,char字符。当您取消引用指向 char 的指针时,您会得到 char。C 没有字符串的内置类型。这就是为什么使用指向包含字符串的内存的指针很常见的原因。该指针通常指向字符串的第一个字符:char *- 指向字符的指针

于 2013-05-18T16:43:10.533 回答