c++ - 将char数组分配给指针
问题描述
我试图理解C++ 中的指针,但我目前对以下内容感到困惑:
char input_line[] = "hi?";
char* p;
p = &input_line;
while (*p)
{
cout << *p << endl;
*p++;
}
我必须在这里感到困惑,因为我认为这表示将一维数组的地址分配给指针;但是,当我尝试编译它时,出现错误: error: cannot convert char (*)[4]' to 'char*' in assignment p = &input_line;
看起来我应该这样做:
const char input[] = "test?";
int quest_count = 0;
const char *i = input;
while(*i){
cout << *i << endl;
*i++;
}
这对我来说没有意义,因为您正在将char
数组分配给存储地址的char
指针。
解决方案
这行代码的错误:
p = &input_line;
可以通过更改它来解决:
p = input_line;
那是因为您正在分配数组的内存方向。它的值是一个指向 char 指针的指针。这就是引发错误的原因。请记住,操作员
&
会为您提供变量存储方向。
指针存储对象的内存方向。数组是特定类型的对象序列,它们位于内存中连续保留的空间量中。
数组的每个索引都是一个由 0 到 9 的数字组成的数字。数组的每个元素都是一个可以获取地址的对象,就像指向对象内存位置的指针一样。在数组中,对象位于连续的内存位置。当您将数组分配给指针时,您将指针分配给数组的第一个元素,它是array[0]
.
当指针值加 1 时,指针将指向内存位置中的下一个对象。因此,数组和指针具有相似的行为。如果将数组分配给指针,然后将指针值增加 1,它将指向数组中的对象。
这不仅适用于char
类型,也适用于 C++ 中的每种类型。在此页面中,您可以获得有关指针和数组的更多信息。您必须注意,指针和数组必须包含或指向相同的变量类型。
这是此页面的示例:
int* ptr; int a[5]; ptr = &a[2]; // &a[2] is the address of third element of a[5].
本页示例的输出示例是:
使用数组显示地址:
&arr[0] = 0x7fff5fbff880 &arr[1] = 0x7fff5fbff884 &arr[2] = 0x7fff5fbff888 &arr[3] = 0x7fff5fbff88c &arr[4] = 0x7fff5fbff890
使用指针显示地址:
ptr + 0 = 0x7fff5fbff880 ptr + 1 = 0x7fff5fbff884 ptr + 2 = 0x7fff5fbff888 ptr + 3 = 0x7fff5fbff88c ptr + 4 = 0x7fff5fbff890
正如您在输出示例中所注意到的,两者都指向相同的内存位置,因此您可以从这两种方法访问对象。
正式地,在C++ 11 标准中提到:
数组到指针的转换:
N
T
“<code>array of ”或“<code>array of unknown bound of ”类型的左值或右值T
可以转换为“pointer toT
”类型的右值。结果是指向第一个元素的指针array
。
您可以查看这些页面以获取有关此主题的更多信息:
推荐阅读
- swiftui - LazyVGrid 每个项目只占据它需要的地方
- here-maps-rest - 与heremap一起搜索邮政编码和国家时不相关的结果建议api
- nuxt.js - 为什么元标题和描述的本地配置不覆盖全局配置 | 努克斯 | 搜索引擎优化元
- anylogic - 如何知道执行 Anylogic 模型之前的剩余时间
- java - 如何投射列表
列出 ? - python - 如何在 numpy 数组中使用 fastrand
- sql - 使用带有输入和输出参数的 sp_executesql?
- github - github 上的“比较和拉取请求”按钮不记得/尊重所选分支?
- javascript - 加载页面时选择特定视图
- sage - 如何使 Sage 将表达式 $(x^y)^y$ 简化为 $x^(y*y)$ 其中 $x$ 和 $y$ 都是变量