|
안녕하세요? 레조입니다.
지금의 집중력으로는 글의 의도를 파악못했습니다.. -_-;
그래서 일반론으로 답해드리고, 혹 문제를 다시 설명하시면 다시
답해드리죠.. ^^;
포인터 변수는 분명 4byte(32bit OS에서)입니다.
char 와 char*는 완전히 다른 형이라고 생각하세요.
즉, char와 char타입의 주소를 기억하는 새로운 타입이 존재한다고
보시면 됩니다.
예를 들면 ptr_to_char라는 새로운 형이 있다고...
이것은 항상 4바이트이며 이 포인터 변수의 데이터는 4바이트 주소를
기억하는 것입니다. 물론 포인터 변수 자체의 주소도 있겠지요.
포인터 변수가 가리키는 곳에가면 데이타가 있게되는것입니다.
물론 알고 계신 내용일것이겠지만.. 다시 상기하시라고..
혹, 데이타의 규칙적 건너뜀이 이상하다고 하셨는데 다시한번 확인해
보세요.
포인터 변수의 건너뜀은 4바이트지만 그 포인터가 가리키는 데이타 주소의
건너뜀은 4바이트가 넘을수도 아닐수도 있습니다.
이것도 당연한 소리겠지만.. ^^;
메모리를 확인하다보면 사소하게도 이런 차이를 실수할때가 간혹 있기에..
(특히 밤새면서 멍한상태로 확인하다가 자주 실수할 수 있죠..)
ps.
혹 다른 내용이면 다시 올려주세요..(다른 분들이 침을 흘리고 있습니다. ^^;)
하루 한글 답하기를 목표로 하는지라 컨디션이 않좋아도 무리했으니 양해를.. --;
오제호 님이 쓰신 글 :
: 다음과 같은 배열의 각 요소를 출력할때
:
: #include <stdio.h>
: #include <conio.h>
:
: int main(void)
: {
: char a[10]="abcdefghij";
: char b[4]="opqr";
: char *ptra, *ptrb;
: int i;
:
: ptra=&a[0];
: ptrb=&b[0];
:
:
: for(i=0;i<=15;i++)
: printf("Address of ptr a : %p \t a[%d] : %c\n",(ptra+i),i,a[i]);
: for(i=0;i<=10;i++)
: printf("Address of ptr b : %p \t b[%d] : %c\n",(ptrb+i),i,b[i]);
:
: getch();
: }
:
: <실행결과>
: Address of ptr a : 0012FF80 a[0] : a
: Address of ptr a : 0012FF81 a[1] : b
: Address of ptr a : 0012FF82 a[2] : c
: Address of ptr a : 0012FF83 a[3] : d
: Address of ptr a : 0012FF84 a[4] : e
: Address of ptr a : 0012FF85 a[5] : f
: Address of ptr a : 0012FF86 a[6] : g
: Address of ptr a : 0012FF87 a[7] : h
: Address of ptr a : 0012FF88 a[8] : i
: Address of ptr a : 0012FF89 a[9] : j
: Address of ptr a : 0012FF8A a[10] :
: Address of ptr a : 0012FF8B a[11] :
: Address of ptr a : 0012FF8C a[12] : ?
: Address of ptr a : 0012FF8D a[13] :
: Address of ptr a : 0012FF8E a[14] :
: Address of ptr a : 0012FF8F a[15] :
: Address of ptr b : 0012FF7C b[0] : o
: Address of ptr b : 0012FF7D b[1] : p
: Address of ptr b : 0012FF7E b[2] : q
: Address of ptr b : 0012FF7F b[3] : r
: Address of ptr b : 0012FF80 b[4] : a
: Address of ptr b : 0012FF81 b[5] : b
: Address of ptr b : 0012FF82 b[6] : c
: Address of ptr b : 0012FF83 b[7] : d
: Address of ptr b : 0012FF84 b[8] : e
: Address of ptr b : 0012FF85 b[9] : f
: Address of ptr b : 0012FF86 b[10] : g
:
: 결과를 보면 포인터의 크기는 4바이트입니다.(32bit compiler에서)
: 메모리상 b[0]의 위치는 7C인데 배열 b의 크기는 4바이트이므로
: 다음번 a[0]는 80부터 위치합니다.
: 여기서 만약 배열 b의 크기가 5바이트라면
: 어드레스 80에 b[4]의 값이 저장되어 있으므로
: a[0]의 어드레스는 84가 됩니다.
: 즉 포인터가 가리키는 어드레스는 0,4,8,C에서 시작됩니다.
: 하지만 아래는 다릅니다.
:
: 만약에 a,b를 배열로 초기화하지 않고 포인터로 선언해서 실행시킨 결과는 다음과 같습니다.
: Address of ptr a : 004020A4 a[0] : a
: Address of ptr a : 004020A5 a[1] : b
: Address of ptr a : 004020A6 a[2] : c
: Address of ptr a : 004020A7 a[3] : d
: Address of ptr a : 004020A8 a[4] : e
: Address of ptr a : 004020A9 a[5] : f
: Address of ptr a : 004020AA a[6] : g
: Address of ptr a : 004020AB a[7] : h
: Address of ptr a : 004020AC a[8] : i
: Address of ptr a : 004020AD a[9] : j
: Address of ptr a : 004020AE a[10] :
: Address of ptr a : 004020AF a[11] : o
: Address of ptr a : 004020B0 a[12] : p
: Address of ptr a : 004020B1 a[13] : q
: Address of ptr a : 004020B2 a[14] :
: Address of ptr a : 004020B3 a[15] : p
: Address of ptr a : 004020AF b[0] : o
: Address of ptr a : 004020B0 b[1] : p
: Address of ptr a : 004020B1 b[2] : q
: Address of ptr a : 004020B2 b[3] :
: Address of ptr a : 004020B3 b[4] : p
: 결과를 보면 어드레스 AE에 a[10]에 해당되는 널값이 출력되고
: b[0]값은 어드레스 AF에 출력되었습니다.
: 제 생각에 포인터크기가 4바이트라면
: b[0]값은 첫번째 배열로 선언한것처럼 어드레스가 0,4,8,C로 끝나는 위치에
: 와야 된다고 생각하는데 결과는 그렇지 않습니다.
: a의 모든 요소를 출력하고 널값 출력한 바로 다음 어드레스가
: b의 시작 주소가 됩니다.(마치 포인터의 크기가 두바이트 같거든요)
:
: 어떤 문자열을 배열로 선언한 것과 포인터로 선언했을 경우
: 메모리상에 실제 데이타가 위치하는 것이 다릅니다.
: 포인터 크기는 4바이트로 고정되어야 하는데
: 뭔가 다르게 동작합니다.
:
: 제가 한 질문을 이해하시겠죠?
: 요점만 물어야 하는데 너무 무식해서 조리있게 질문을 할수가 없네요.
: 너무 장황하게 설명한것 같네요.
:
: 고수님의 답변이나 조언 좀 부탁드리겠습니다.
:
:
:
:
:
:
:
:
:
:
:
|