2011-01-24 2 views

답변

11

포인터 계산은 포인터의 정적 유형 [*] 크기로 수행되므로 sizeof *ptr을 효과적으로 추가합니다. 멤버의 정렬은 객체의 크기, 유형의 정렬 (객체 끝의 패딩) 등으로 계산됩니다.

struct test { 
    int a; 
    char b; 
}; 

test의 크기는 타입에 의해 정렬 4 바이트 인 경우 5, (32 개 비트의 int 가정)되지 않을 것이다.

당신이 기본 클래스에 파생 된 개체의 주소를 할당 할 수 있지만 포인터 연산이 포인터의 종류가 아닌 실제 개체에 대한 작동 ++ [*] C의 것을 참고 :

struct base { int x; }; 
struct derived : base { int y; }; 
int main() { 
    base * p = new derived[10]; 
    base * q = p+1;    // this does not point to the second `derived`!!! 
} 
+1

+1 기본/파생 된 변환과 관련된 포인터 산술의 문제를 설명합니다. –

1

포인터 연산이 작동하려면 sizeof (any_type) + 기본 주소를 지정해야합니다.

4
  1. 를 sizeof (ANY_TYPE) PTR
  2. 의 malloc 후에는
4

부호 서명간에 차이/컴파일러 1과 해당 번호로 대체 할 데이터의 타입을 정렬하기에 적합한 메모리를 반환 바이트 수 이동하려는 개의 오브젝트 수를 지정하는 것입니다..

2

포인터를 볼 때 포인터에 스칼라 값이 있음을 잊어보십시오. 대신 포인터는 연속 공간 (메모리)에 저장된 객체에 대한 액세스를 제공하는 일종의 토큰이라고 생각하십시오. ptr이 어떤 (임의의) 위치에있는 객체에 대한 액세스를 제공하는 포인터 인 경우 ptr+1ptr-1은 이웃에 대한 액세스를 제공하는 포인터를 반환합니다.