본문 바로가기

Layer7/동아리 숙제

모두의 코드 C pointer 문제풀이

강좌1.

=======================================

문제 1

*  & 연산자의 역할이 무엇인지 말해보세요 (난이도 : 下)

   &  : 참조 연산자 (주소값을 나타냄)

   사용 방법:

	int a = 1;
	printf("%p\n", &a);

위의 코드를 실행 시키면 변수 a의 주소값이 나온다.

(주소값은 실행 할때마다 바뀐다.)

출력값 1) 0x0F9387F2

출력값 2) 0x0F3957F2

 

*   : 역참조 연산자

   사용 방법:

int a = 4;
int *p;
*p = &a;
printf("%p\n", p); // *p == a

(*P는 a의 주소값을 역참조 하므로 a의 값을 나타낸다.)

 

문제 2

int **a; 와 같은 이중 포인터(double-pointer) 에 대해 생각해 보세요 (난이도 : 中上)

   이중포인터는 말 그대로 포인터를 두번 쓴다는 뜻이다.

int a = 4;
int *p1 = &a;
int **p2 = &p1;

위의 코드에서

**p2 == a이다.

왜내하고 *p2 == p1의 주소가 되고,

**p2 == *p1이 되니까 결국 a를 가르키기 때문이다.

 

-----------------------------------------------------------------------------------------------------------------------------------

 

강좌 2.

=======================================

문제 1

int arr[3][3]; 과 같은 배열은 내부적으로 어떻게 처리되는지 생각해보세요 (난이도 : 中)

int arr[3][3];
// 배열 채우기
for (int i = 0; i < 3; i++)
{
	for (int j = 0; j < 3; j++)
    {
    	arr[i][j] = j;
    }
}
// 주소값 확인
for (int i = 0; i < 3; i++)
{
	for (int j = 0; j < 3; j++)
    {
    	printf("arr[%d][%d]의 주소값: %p\n", i, j, &arr[i][j]);
    }
}

위의 결과에서 확인 할 수 있는 사실은 출력값이

(이해를 돕기 위해 주소값은 임의로 정함)

arr[0][0]의 주소값: 0x00000000

arr[0][1]의 주소값: 0x00000004

arr[0][2]의 주소값: 0x00000008

                 ·

                 ·

                 ·

주소값이 4만큼 증가한다는 것이다.

그리고 이 4byte는 int형의 크기와 같다.

만일 int arr[3][3]이 아닌, char arr[3][3]이였다면

주소값은 char형의 크기인 1만큼 증가할 것이다.

이를 통해 우리는 배열은 빈공간 없이 따닥따닥 붙어있고,

각 공간의 크기는 자료형의 크기라는 것이다.

이는 연산을 통해서도 할 수 있다.

int a = 4;
int *p = &a;
printf("P: %p\n", p);
printf("P + 1: %p", p + 1);

(이해를 돕기 위해 주소값은 임의로 정함)

이를 실행하면

p: 0x00000001

p + 1: 0x00000005

이라는 결과값이 나온다.

마찬가지로 int형을 char형으로 바꿔주면 p + 1: 0x00000002가 나올것이다.

 

문제 2

int* arr[3]; 과 같은 배열이 가지는 의미는 무엇일까요? (난이도 : 中)

int *arr[3];
printf("%d", sizeof(arr));

코드의 실행 결과는 24가 나온다.

이유는 포인터형의 크기는 8byte고, 이 포인터형이 3개가 나란히 연결되어 있기 떄문이다.

포인터도 자료형이다!

 

더 나아가서

	int a =1, b = 2, c = 3;
	int *arr[3];
	arr[0] = &a;
	arr[1] = &b;
	arr[2] = &c;
	printf("arr[0]: %d\n", *arr[0]); // a
	printf("arr[1]: %d\n", *arr[1]); // b
	printf("arr[2]: %d\n", *arr[2]); // c

의 출력값은

arr[0]: 1

arr[1]: 2

arr[2]: 3

이 나온다.

이로써 int *arr[3]은 그냥 포인터라는 자료형인 배열이다.