2012-06-30 1 views
0

변수 포인터와 포인터, 포인터 포인터 및 포인터 포인터를 저장하는 데 사용되는 주소의 크기를 이해하려고했습니다. 그 결과는 다소 혼란 스럽습니다.이 간단한 포인터 프로그램 출력에 대한 설명은 무엇입니까

#include <stdio.h> 
#include <conio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    char *** ppptr_string = NULL; 
    int  *** ppptr_int = NULL; 
    double *** ppptr_dbl = NULL; 

    char c=0; int i=0; double d=0; 

    printf("\n %d %d %d %d %d\n", sizeof(&ppptr_string), 
    sizeof(ppptr_string), sizeof(*ppptr_string), sizeof(**ppptr_string), 
    sizeof(***ppptr_string)); 
    printf("\n %d %d %d %d %d\n", sizeof(&ppptr_int), sizeof(ppptr_int),  
    sizeof(*ppptr_int), sizeof(**ppptr_int), sizeof(***ppptr_int)); 
    printf("\n %d %d %d %d %d\n", sizeof(&ppptr_dbl), sizeof(ppptr_dbl),  
    sizeof(*ppptr_dbl), sizeof(**ppptr_dbl), sizeof(***ppptr_dbl)); 


    printf("\n sizeof(char) = %d, sizeof(int) = %d, sizeof(double) = %d", 
    sizeof(c), sizeof(i), sizeof(d)); 
    printf("\n sizeof(&char) = %d, sizeof(&int) = %d, sizeof(&double) = %d", 
    sizeof(&c), sizeof(&i), sizeof(&d)); 

getch(); 
return 0; 
} 

이제 혼란 : 여기

는 코드입니다. 가변 주소는 항상이 기계에서 2 바이트 길이임을 알 수 있습니다. 변수의 유형과 상관없이 포인터 변수의 유무에 관계없이 하지만 왜 여기에 많은 항목이 들어서서 크기가 4가 될까요? 포인터는 크기에 관계없이 항상 크기가 4입니다. 변수가 저장되는> < 주소는 크기가 2입니다. 가리키는 내용은 유형에 따라 크기가 있습니다.

출력 크기가 4 인 이유는 무엇입니까 ?? 볼랜드 C에서

내 출력 ++ 당신이 유형 TT*** ptr 같은 포인터에 대한 포인터가있는 경우 5.02 enter image description here

+1

conio.h? 이것은 MS-DOS 컴파일러입니까? – src

+3

4 세가 나올 때 나 2 세가 나올 때 나는 얻지 못하는만큼 나눠주세요. –

+1

만약 포인터 크기가 4라면, 포인터의 종류는 당신의 컴퓨터에서 4 바이트입니다. 언어 표준은 포인터가 어떤 크기인지 말해주지 않습니다. –

답변

3

, 다음 ptr, *ptr, **ptr 포인터 자체입니다. 당신은 아마 그래서 sizeof(ptr) == sizeof(*ptr) == sizeof(**ptr), 32 비트 시스템에서 작업 (또는 32 비트 응용 프로그램을 컴파일)하고 : 그 크기가 너무 4 그래서

--- Program output --- 

4 4 4 4 1 

4 4 4 4 4 

4 4 4 4 8 

    sizeof(char) = 1, sizeof(int) = 4, sizeof(double) = 8 
sizeof(&char) = 4, sizeof(&int) = 4, sizeof(&double) = 4 

&ptr은, 주소/T***에 대한 포인터입니다. 포인터를 최대 레벨 (***ptr)로 역 참조하는 경우에만 실제 유형을 가지며 다른 포인터는 갖지 않습니다.

+0

예 32 비트 시스템을 사용하고 있습니다. 다음은 결과입니다. 첫 번째 열에 2 초를 모두 가져와 그 이유를 이해합니다. 그러나 다른 열에서 4를 얻는 이유는 전혀 이해가되지 않습니다. 마지막 행은 32 비트 컴퓨터 이후 4 초가 아니라 2 초가됩니다. – quantum231

+0

어떤 컴파일러를 사용합니까? 나는이 행동을 재현 할 수 없다. 또한 첫 번째 열의 값 '2'는 전혀 이해가되지 않습니다. 32 비트 시스템의 주소는 32 비트 = 4 바이트가 필요합니다. – Zeta

+0

볼랜드 C++ 5.02 컴파일러를 사용하고 있습니다. DOS 콘솔 응용 프로그램을 만들었습니다.검은 콘솔 창에서 결과를 복사하고 여기에 넣는 방법을 모르겠습니다. – quantum231

0

로컬 변수에 대한 포인터가 가까이에 있지만 (* (32 비트) 포인터는 유형으로 선언 된) 포인터가 발생한다고 생각합니다.

16 비트 Intel 프로세서 (또는 "리얼 모드"의 32 비트 프로세서)에서 작동하는 것이 단점입니다. DOS에서는 1MB의 메모리 (실제로는 640KB) 만 액세스 할 수 있습니다. 원거리 포인터의 상위 16 비트는 세그먼트 (메모리의 64k 페이지)이고 하위 16 비트는 오프셋입니다.

http://wiki.answers.com/Q/What_are_near_far_and_huge_pointers_in_C

답변자 가능성이 32 비트 (또는 그 이상)의 프로세서에서 32 비트 (또는 그 이상)의 OS를 사용하고이를 재생할 수 없다

http://en.wikipedia.org/wiki/Real_mode

.

관련 문제