“如果我给一个指针加1,实际加的值将是指针指向的类型的大小吗?”
C++ 标准中不能保证指针是指针指向的某个内存的字节数。如果将整数添加n
到指针,则结果是指向n
该数组中第 th 个下一个元素的指针:
int iarr[10];
int* pi = iarr; // pi points to iarr[0]
int* pi2 = pi+2; // pi2 points to iarr[2]
当您查看时,您会得到什么,例如int repr = (int)pi;
,C++ 标准没有定义。
在最流行的平台/实现上会发生什么,是
(int)pi2 == ((int)pi) + 2*sizeof(int)
当您有指针数组时,会发生完全相同的事情:
int* piarr[10];
int** ppi = piarr; // ppi points to iarr[0]
int** ppi2 = piarr+2; // ppi2 points to iarr[2]
请注意, 的类型piarr
是指向 int的 10 指针数组,因此该数组的元素具有指向 int 的类型指针。因此,指向该数组元素的指针具有指向 int 指针的类型指针 。
char* ch[5]
是一个由 5 个指针组成的数组char
。
"Hello"
等是(窄)字符串文字。(窄)字符串文字是n const 的数组char
,其中n是字符串的长度加 1(对于终止\0
字符)。数组可以隐式转换为指向数组第一个元素的指针,这就是这里发生的情况:
char* ch[5] =
{
"Hi",
"There",
"I,m a string literal"
};
该数组ch
包含三个指向 char的指针。由于这些是通过将数组转换为指针获得的,它们中的每一个都指向char 数组的第一个元素:指针ch[0]
(数组的第一个元素ch
)指向数组“Hi”的第一个元素,ch[1]
指向“那里”的第一个元素等等。
请注意,还涉及从const char
to的转换char
,该转换已被弃用,应避免使用。更好的形式是:
char const* ch[5] =
{
"Hi",
"There",
"I,m a string literal"
};
表达式*(ch + 2)
解释如下:
ch
该数组的名称(见上文)
ch + 2
将3 个指向 char的指针的数组隐式转换ch
为指向 char的指针,即指向数组第一个元素的指针。因此,此表达式的类型是指向 char 的指针。ch
ch + 2
使上一步的指针现在指向第二个下一个元素;它指向 的第一个元素ch
,所以它现在指向数组的第三个元素ch
。
*(ch + 2)
最后,*
取消引用指针并“获取”指向的对象。由创建的指针指向ch + 2
数组的第三个元素ch
,因此,这个表达式解析为数组的第三个元素ch
。现在表达式的类型是指向 char的指针。
表达式的结果被传递给std::cout::operator<<
. 由于表达式的类型是指向 char的指针,cout
因此将打印该字符串:数组的第三个元素ch
。