강좌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]은 그냥 포인터라는 자료형인 배열이다.
'Layer7 > 동아리 숙제' 카테고리의 다른 글
Dreamhack 공부 내용 정리 및 문제풀이 (Reversing) (0) | 2020.08.07 |
---|---|
gdb를 활용한 간단한 바이너리 분석과 보고서 작성 (0) | 2020.07.12 |
python과 pwntools 활용법 익히기 (0) | 2020.07.08 |
Linux 환경 구축 (0) | 2020.06.28 |
C언어 pointer (0) | 2020.06.24 |