在 C++ 或 C 中使用整数和字符指针

Using Integer And Char Pointers in C++ or C?

本文关键字:整数 字符 指针 C++      更新时间:2023-10-16
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 *cptr = "this is a test";
cout << *cptr; // Here output = 't'
cout << cptr; // Here output = 'this is a test'
int *ab = (int *)5656;
cout << *ab; //Here appcrash.

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

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

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

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

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

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

(您的代码正在使用已弃用的char*转换,所以我将其更改为const char*

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

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

I/O 库具有特殊的重载,这些重载占用 const char* s 并将其视为指向字符串。如果没有,cout << cptr只会打印出cptr的地址。相反,这些特殊重载将打印出假定cptr指向的以 null 结尾的字符数组。

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

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

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

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

  • 是带来指针(?

No. * 是一个运算符,用于提供指针指向的内存内容。

这里:

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。C 没有字符串的内置类型。这就是为什么通常使用指向包含字符串的内存的指针的原因。此指针通常指向字符串的第一个字符:char * - 指向字符的指针