Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[6490] Re:포인터에 배열이름을 대입할때 생기는 일.
이명훈 [bcpp45] 4154 읽음    2010-01-23 07:29
안녕하세요.
제가 초보라서 좋은 답변을 드릴수는 없지만, 그냥 제 생각을 말해보겠습니다.

먼저 변환지정 문자들은 %s, %0x, %x로 3개인데,  다른인자는 2개 밖에 없는 점이
잘못된 것 같습니다.
printf("%s / %0x%x\n", str, str);



#include  

int main(void) 
{ 
	char *pnt; 
	char str[] = "bluesky and shine"; 

	pnt = str; // <--(3번) 

	printf("%s / %0x\n", str, str);         // <--(1번) 
	printf("%s / %0x\n", pnt, pnt);        // <--(2번) 
	system("pause"); 
	
	return 0;
} 


위의 코드에서 (3번)에 해당하는 부분을 pnt = &str로 바꿔야하지 않겠나고 하셨는데,
배열의 이름은 배열의 시작 주소를 의미합니다.
그러므로 &str[0]과 같습니다.

그런데 (3번)부분의 str배열 이름 앞에다 &를 붙히게 되면, 이 의미가  1차원 배열전체를 가리키는
주소을 나타내게 되어, 컴파일 경고가 발생합니다.

pnt는 char* 인데,  &str은 char (*)[18] 으로 서로 다르기 때문입니다.


경고가 발생하지 않게하려면 위에서 포인터 변수를 선언한 부분도 
아래와 같이 바꿔주야합니다.

char (*pnt)[18];   // 18은 bluesky and shine\0  의 크기



배열전체를 가리키는 포인터는 아래 소스와 같이
2차원 배열에서 그 안의 1차원 배열을 가리킬때 유용할 수 있을 것 같습니다.

#include  

int main(void) 
{ 
	int i;
	char *pnt;
	char (*pnt_II)[21]; 	
	char str[5][21] = {	"00_bluesky and shine",
						"01_bluesky and shine",
						"02_bluesky and shine",
						"03_bluesky and shine",
						"04_bluesky and shine"};
					
	pnt = str; // <--(3번) 경고가 발생하는 부분이지만 실행에는 문제가 없었습니다.
	pnt_II = &str[0]; // <--(4번)
	
	for(i=0; i<5 ;i++)
	{
		printf("pnt: %s \n" , pnt+i); 		
	}
	
	putchar('\n');
	putchar('\n');
	
	for(i=0; i<5 ;i++)
	{	
		printf("pnt_II: %s \n" , pnt_II+i);
	}
	
	
	system("pause"); 
	
	return 0;
} 


(3번)에 의해  배열의 주소를 할당 받은 pnt변수의 경우
증가하면서 값을 출력할때, char의 크기만큼 시작 포인터를 증가시키면서 출력하게 되는데,

(4번)에 의해 배열의 주소를 할당 받은 pntII변수의 경우는
1차원 배열 전체를 가리키기 때문에, 2차원 배열의 모든 내용을 출력할 수 있습니다.



[질문2]에서
(변수이름 == &변수이름[0]) 이거 보단

(배열이름 == &배열이름[0]),  (포인터변수이름 == &포인터변수이름[0])
이 나을 것 같습니다.

그러나 포인터변수이름의 경우는 괜히 복잡하게,
일부러  &포인터변수이름[0]  이런 식을 써줄 필요가 없을 것 같구요..


"%s형태로 pnt가 아닌 *pnt를 출력하라고 명령해야 "bluesky and shine"
요놈이 출력될것 같은데 이상하게 그냥 pnt로도 "bluesky and shine"가 넘흐나 얇밉게도 잘 출력 되고 있다는 것입니다."

위의 부분에서는 잘못된점이...

그 시점의 *pnt는 str[0]의 의미와 같습니다. 그러므로 문자 b(ASCII코드 98번 Hex로 0x62) 가 되는데,
그것을 %s로 출력하라는 것은 0x00000062 번지 주소부터 시작해서
'\0'문자를 만날때까지 읽은 내용을 화면에 출력하라는 것이 되게 되므로,
bluesky and shine 라는 문자열 출력과는 전혀 관계없게 되어버립니다.


써보고 나니 예도 별로 적당한 것 같지 않네요.. 그냥 참고만 해보세요.


이상욱 님이 쓰신 글 :
: 이 개념만 제대로 잡히면 뻥~ 뚫릴것 같아서 '간곡히' 질문 올립니다.)
:
: 처음으로 프로그래밍이라는걸 공부하게 됐습니다.
: 역시 고비는 포인터에서 왔는데요.
: 열심히 파다 보니 " 올레~~ "  포인터라는게 뭔지 알게된 것 같았습니다.
: 뭐 좀 더 부연 설명이 필요한 부실한 정의지만
: 제 나름대로 포인터를 이렇게 정의했죠..
:
: 오로지 주소값만을 값으로 가지는 변수!!
:
: 이 말은 "어딘가를 가리키는 일만 한다"는 뜻과도 같다고 생각했습니다.
: 저는 포인터를 이용해 값을 출력하는 경우가 가장 많이 혼란스러웠는데
: 이 경우도 포인터가 가지고있는 값을 보여주느게 아니라 *(에스터뤼스크)를 이용해서
: 포인터가 가리키고 있는 주소에 들어가있는 값을 참조하여 보여준다는 것으로 생각했습니다.
: (여기까진 문제가 없나요?? ;;;;)
:
: 저의 이 정의가 질문에 적힌 저 상황만 만나고나면 무너집니다.(아래 코드의 (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방식으로 표현되야 할 것 같은데 말이죠.
:
: 그래서 타협을 하고 계속 공부를 진행했습니다.
: " 포인터에 배열이름이 대입되면 둘이 완전 똑같아 진다. "
: (단, 포인터는 변수적 성격을 가지지만 배열은 상수적 성격을 가진다는 차이만 제외한고...)
: 이러고 나서는 뒤에서 같은 상황을 만나도 뭐 이해할순 있었습니다.
: 그러나 마음 한켠의 찝찝함이 가시질 않습니다.
: 뭔가 제가 심각하게 모르고 있는 부분이 있거나 착각하는 부분이 있는것 같아요
: 먼저 공부 하신 분들의 명쾌한 해답 기다리겠습니다.
:
: (부족한 제 질문을 끝까지 읽어 주셔서 감사합니다.)

+ -

관련 글 리스트
6488 포인터에 배열이름을 대입할때 생기는 일. 이상욱 6028 2010/01/22
6492     Re:포인터에 배열이름을 대입할때 생기는 일. 이동일 3893 2010/02/01
6490     Re:포인터에 배열이름을 대입할때 생기는 일. 이명훈 4154 2010/01/23
6489     Re:포인터에 배열이름을 대입할때 생기는 일. Intotheblue 3020 2010/01/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.