이 개념만 제대로 잡히면 뻥~ 뚫릴것 같아서 '간곡히' 질문 올립니다.)
처음으로 프로그래밍이라는걸 공부하게 됐습니다.
역시 고비는 포인터에서 왔는데요.
열심히 파다 보니 " 올레~~ " 포인터라는게 뭔지 알게된 것 같았습니다.
뭐 좀 더 부연 설명이 필요한 부실한 정의지만
제 나름대로 포인터를 이렇게 정의했죠..
오로지 주소값만을 값으로 가지는 변수!!
이 말은 "어딘가를 가리키는 일만 한다"는 뜻과도 같다고 생각했습니다.
저는 포인터를 이용해 값을 출력하는 경우가 가장 많이 혼란스러웠는데
이 경우도 포인터가 가지고있는 값을 보여주느게 아니라 *(에스터뤼스크)를 이용해서
포인터가 가리키고 있는 주소에 들어가있는 값을 참조하여 보여준다는 것으로 생각했습니다.
(여기까진 문제가 없나요?? ;;;;)
저의 이 정의가 질문에 적힌 저 상황만 만나고나면 무너집니다.(아래 코드의 (3번)라인.)
역시 말보다는 코드가 설명하기 좋을것 같아서 제가 테스트했던 간단한 코드를 소개하겠습니다.
#include <stdio.h>
main()
{
char *pnt;
char str[] = "bluesky and shine";
pnt = str; // <--(3번)
printf("%s / 0x%x\n", str, str); // <--(1번)
printf("%s / 0x%x\n", pnt, pnt); // <--(2번)
system("pause");
}
코드실행 결과는
=================================
bluesky and shine / 0x12ff40
bluesky and shine / 0x12ff40
계속하려면 아무키나 눌러주세요...
=================================
이렇습니다. 저의 질문은 (1번)라인과 (2번)라인에 모두 있습니다.
[질문1]
(1번)라인에있는 두번째 str(빨간글씨)입니다.
제 생각엔 주소값을 출력하려면 &str로 적어 줘야 할 것 같아서요.
저렇게 그냥 str로 적어 놓으면 str배열 안의 값을 앞에서 선언한 서식문자인 %x형식으로 출력해야 할것같습니다. 즉, 문자열 "bluesky and shine"가 16진수로 표현되여 화면에 출력 되야 할것같다는 말입니다.
똑같은 변수 str로 명시해 두었고, 서식문자만 다르니까 말이죠.
그래서 두번째 str(빨간글씨)를 &str로 고쳐서 다시 컴파일, 실행 해봤습니다. 결과는 동일했습니다.
영~찝찝해서 "배열이름"은 "그 배열의 첫번째값이 들어 있는 주소값"을 가리킨다 말을 생각해보았습니다.
그렇다면 똑같이 str로 변수가 명시되어있어도 앞에 서식문자에 따라 %s의 경우엔 "null을 만날때까지 배열안의 문자를 출력해라." 가 되고 %x인 경우엔 "주소값을 보여줘라" 로 컴퓨터다 다르게 수행을하는 건가요?
[질문2]
이번엔 (2번)라인의 첫번째 pnt입니다. (3번)라인에 의해서 pnt라는 포인터 변수에 str배열의 첫번째 요소가들어있는 주소값 즉, &str[0]요놈이 들어가게 되는거는 알겠습니다. ( 변수이름 == &변수이름[0] 이니까요)
그렇다면, %s형태로 pnt가 아닌 *pnt를 출력하라고 명령해야 "bluesky and shine" 요놈이 출력될것 같은데 이상하게 그냥 pnt로도 "bluesky and shine"가 넘흐나 얇밉게도 잘 출력 되고 있다는 것입니다.
위의 코드에서 처럼 그냥 pnt로 한다면 pnt가 가지고 있는 str배열의 첫번째요소의 주소값이 %d방식으로 표현되야 할 것 같은데 말이죠.
그래서 타협을 하고 계속 공부를 진행했습니다.
" 포인터에 배열이름이 대입되면 둘이 완전 똑같아 진다. "
(단, 포인터는 변수적 성격을 가지지만 배열은 상수적 성격을 가진다는 차이만 제외한고...)
이러고 나서는 뒤에서 같은 상황을 만나도 뭐 이해할순 있었습니다.
그러나 마음 한켠의 찝찝함이 가시질 않습니다.
뭔가 제가 심각하게 모르고 있는 부분이 있거나 착각하는 부분이 있는것 같아요
먼저 공부 하신 분들의 명쾌한 해답 기다리겠습니다.
(부족한 제 질문을 끝까지 읽어 주셔서 감사합니다.)
|