4.3 포인터 문제 풀이

Kal·2021년 7월 21일
0

C언어

목록 보기
10/17
Q1. int형으로 선언한 변수 data에 값 0x12345678이 저장되어 있다.
data 변수에 직접 값을 대입하지 않고 short*형 포인터를 선언하여 data 변수의
값을 0x12340412로 변경하는 코드를 작성하라.
# include <stdio.h>

void main()

{
	int data = 0x12345678;
	short* p = (short*)&data;
	*p = 0x0412;
	printf("0x%X", data);
}
Q2. int* 형으로 선언한 포인터 p 변수에 200번지가 저장되어 있다. 
p++; 명령을 수행하고나면 p에 저장된 주소는 몇 번지일까?
p++; 명령을 수행하게 되면 p의 주소에서 1 값 증가를 의미하며, int* 형으로 선언한
포인터 변수이기 때문에 4 byte 증가해야 다음 데이터 주소가 된다. 따라서 200번지에
4byte를 더한 204번지가 정답이다.

Q3. int*형으로 선언한 포인터 pa와 pb 변수가 있다. 
pa에는 100번지가 들어 있고, pb에는 108번지가 들어 있다.
이런 상황에서 pb-pa의 값은 얼마인가?
int*형이라면 4바이트이다. 100번지 - 108번지 = 8번지 이므로 
8번지 = 4바이트 x2. 즉 pa - pb = 2이다. 
Q4. 다음과 같이 a,b,c 변수가 있다. 이 변수에는 각각 char a = 0x12; 
char b = 0x34; short c = 0x5678; 값이 저장되어 있다. 
이렇게 a,b,c변수에 저장된 값과 포인터를 사용하여 새로운 변수 int =t;에
0x1235678 형태의 값을 저장하는 코드를 작성해 보아라.
처음 오답 :

#include <stdio.h>

void main()
{
   int t;
   char a = 0x12, b = 0x34;
   short c = 0x5678;
   
   char *pa, *pb;
   short *pc; /* 포인터 변수 선언 */
   
   pc = (short*)&t;
   *pc = c;
   pc = pc +1;
   
   pb = (char*)&t;
   *pb = b;
   pb = pb +1;
   
   pa = (char*)&t;
   *pa = a;
   
   printf("0x%08X", t);
}

출력값 : 0xCCCC5612 (오답)
틀린 이유 : pc = pc +1; 로 넘겨서 주소를 바꾸었다고 생각했지만, 
다른 포인터 변수 pb가 short*형으로 t의 2바이트 시작 주소로 들어갔기 때문에
무용지물이었다. pa 또한 마찬가지였다. 
이러한 이유로 *pc때문에 56값은 남아있고, 첫 번째와 두 번째 자리가 
*pb로 덮였다가, *pa 값으로 다시 덮여지면서 0xCCCC5612라는 오답이 나왔다.
새롭게 작성한 답안 코드

#include <stdio.h>

void main()
{
	int t;
	char a = 0x12, b = 0x34;
	short c = 0x5678;

	char* pa, * pb;
	short* pc; /* 포인터 변수 선언 */

	pc = (short*)&t;
	*pc = c;

	pb = (char*)&t;
	pb = pb + 2;
	*pb = b;
	

	pa = (char*)&t;
	pa = pa + 3;
	*pa = a;

	printf("0x%08X", t);
}

출력값 : 0x12345678
pb = pb + 2;를 넣어 pb의 시작주소를 바꾸었고, 
pa = pa + 3; 으로 pa의 시작 주소 또한 변경하였다. 
profile
프로그래밍 독학

0개의 댓글