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의 시작 주소 또한 변경하였다.