c++指针/数组的区别
c++ pointer/array distinction
我正在练习c++期中考试,我不明白为什么下面的代码不正确。
int ip[] = {6, 7, 2, 4, -5};
for (int i = 0; i < 5; ++i, ++ip)
cout << *ip;
我怀疑这与-5有关,但我迷路了,我真的很想解决这个问题。
不能增加ip
,因为它是一个数组,而不是指针,所以它的值[ip
]是固定的。
因此,问题在于表达式++ip
错误在于不能增加静态指针(也称为数组)的值。
简单的解决方案是简单地使用索引运算符[]
。
int ip[] = {6, 7, 2, 4, -5};
for (int i = 0; i < 5; i++)
cout << ip[i];
您可以使用索引直接访问这些元素:
int ip[] = {6, 7, 2, 4, -5};
for (int i = 0; i < 5; ++i)
cout << ip[i];
或者,如果您想为此使用指针算术,您可以使用临时变量指针,它将指向该数组的第一个元素:
int ip[] = {6, 7, 2, 4, -5};
int* myPtr = ip;
for (int i = 0; i < 5; ++i, ++myPtr)
cout << *myPtr;
注意,int* myPtr = ip;
等于int* myPtr = &ip[0]
。
原因是:
-
当涉及到数组
ip[]
时,ip指向第一个元素的数组,并且它是固定的,不能更改(它就像常量指针,即指向固定的内存位置。)2.所以当你增加它时,你违反了条件,这就是为什么你会得到一个错误
试试这个
int ip[] = {6, 7, 2, 4, -5};
for (int i = 0; i < 5; ++i)
cout << ip[i];
ip
是一个静态数组。。你不能增加它!最终,您可以创建另一个指向ip
:的指针
int* p = ip;
则递增CCD_ 10。
您需要分别增加数组ip[]的每个值
指针和数组是不同的东西。指针会衰减为数组,但它不会反过来工作。运算符++没有在数组上定义,因此ip衰减到一个指针,指针(未命名的临时指针)会递增,但不能将其存储回ip中,因为ip是一个数组。
正如您所期望的那样,下面的代码应该可以工作。
#include <iostream>
int main(){
int ip[] = {6, 7, 2, 4, -5};
int *p=ip;
for (int i = 0; i < 5; ++i, ++p)
std::cout << *p;
}
只是为了形式化其他人所说的:ip
是一个数组,而不是指针。它隐式转换为指针,但隐式转换是一个右值,++
运算符需要左值。除了隐式转换(根本不会发生上下文),数组和指针之间没有真正的关系。
还要注意,在C++中,[]
不是为数组类型定义的,只是为指针(或用于具有用户定义的重载的类型)。它只适用于数组,因为隐式转换。
相关文章:
- 动态分配的数组和静态数组之间的区别
- 在 C/C++ 中将数组作为形式参数作为 int arr[] 和 int arr[N] 传递的区别
- 删除[i] 数组和删除数组 [i] 之间的区别
- 类型测试对象的动态数组的这两个声明之间的区别?
- 动态数组和动态分配数组有什么区别?
- sizeof(空结构)和sizeof(带有空数组的结构)之间的区别?
- 初始化的多维数组,用声明初始化和声明后初始化有什么区别
- 数组的变量名和该数组的地址有什么区别?
- C/C++ 中的常量数组和静态常量数组有什么区别
- 这些在C 中初始化C数组的方式之间有区别吗?
- 将指向结构数组的指针传递给函数的区别
- 当我删除数组时,指针在哪里?指向数组的指针与数组中的元素之间的区别
- 系统堆栈中的两个函数的递归调用(将不同数量的数组作为参数传递)有什么区别
- 数组和单独初始化之间的区别
- 字符指针和字符数组之间的区别
- 在构造函数中创建数组与在 C++ 中创建声明之间的区别
- 指针阵列和指针数组的指针之间的区别
- char阵列[]和char *数组之间有什么区别
- 实例化数组的方法之间的区别
- 字符数组的 cin 和 cin.get() 之间的区别