在 C++ 或 C 中使用整数和字符指针
Using Integer And Char Pointers in C++ or C?
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 *
- 指向字符的指针
- 显示基于用户输入的整数的字符
- 尝试将字符串/字符转换为整数会产生意外结果
- 如何使用C++将字符串中的字符转换为整数变量
- 将超出范围的整数分配给有符号字符类型
- 碱基对映射 - 将 argv[i] 移动到整数或字符作为输入
- 当我输入字符类型的数字时,为什么我无法获得整数?
- 输入验证以筛选出字符、字符串和一系列整数
- 字符和整数中 **(ptr+1) 的值差异
- 如何将整数向量值插入字符向量
- 字符到整数数组
- 为什么对无符号字符进行算术运算会将它们提升为有符号整数
- 不能将字符转换为整数吗?
- 如果我们在其中输入一个整数,则字符会给出整数作为输出,但是当分配给它一个整数时,这不会发生。为什么?
- 为什么我们不能将使用异或运算找到的整数转换为字符?
- 有没有办法将字符类型转换为整数?
- 在c++中读取文件时,它如何自动将字符放入字符数组,将数字放入整数变量
- (C/C++)fscanf_s从txt文件以字符形式读取数组时缺少整数参数错误
- 如何从字符数组C++中提取2个整数并将它们存储在2个变量中(初学者)
- 取消随机排列整数/字符数组
- 双倍到无符号的整数/字符