“如果我给一个指针加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 charto的转换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。