C++ 按sizeof(T)增量的字节指针算法:未定义的行为?

C++ 按sizeof(T)增量的字节指针算法:未定义的行为?,c++,pointers,language-lawyer,C++,Pointers,Language Lawyer,以sizeof(int)的增量对类型为char*(指向int数组)的指针执行指针算术并在以后取消引用,这是未定义的行为吗? 例如,考虑下面的代码。它是否调用未定义的行为 我认为/*1*/应该是合法的,而/*2*/当然是合法的,但我不确定/*3*/ 有一个问题是类似的,但没有被接受的答案 int foo() { int arr[10] = {0}; int i = 4; int s = sizeof(int); /*1*/ const char * cmem = reinterpr

sizeof(int)
的增量对类型为
char*
(指向
int
数组)的指针执行指针算术并在以后取消引用,这是未定义的行为吗? 例如,考虑下面的代码。它是否调用未定义的行为

我认为
/*1*/
应该是合法的,而
/*2*/
当然是合法的,但我不确定
/*3*/

有一个问题是类似的,但没有被接受的答案

int foo() {
  int arr[10] = {0};
  int i = 4;
  int s = sizeof(int);
  /*1*/ const char * cmem = reinterpret_cast<const char*>(&arr[0]);
  /*2*/ cmem += i * s;
  /*3*/ return *reinterpret_cast<const int*>(cmem);
}
intfoo(){
int arr[10]={0};
int i=4;
int s=sizeof(int);
/*1*/const char*cmem=reinterpret_cast(&arr[0]);
/*2*/cmem+=i*s;
/*3*/返回*重新解释铸件(cmem);
}

此代码正常。允许在对象的范围内(或超过端点的范围内)执行指针算术,严格的别名规则允许使用仅在常量方面与实际对象不同的左值来访问该对象。

。如果有类型为T的指针p1和指向同一地址的字符指针p2,则“p1+i”等于“*(p2+i*sizeof(T))”。