Layer7 포인터 과제
2020. 7. 1. 22:31ㆍLayer7
Layer7 포인터 과제
문제 1. *
와 &
연산자의 역할이 무엇인지 말해보세요
*연산자는 포인터변수 안에 저장되어있는 다른 변수의 주소로 값을 참조할 때 사용한다. &연산자는 변수가 실제로 저장되어있는 주소를 반환한다.
- 코드
#include <stdio.h>
int main()
{
int a = 5;
int *b = NULL;
printf("a의 주소값은 %p 입니다.\n", &a);
printf("a의 값은 %d 입니다.\n", a);
printf("a의 주소값을 포인터 b에 대입합니다.\n");
b = &a;
printf("b의 주소값은 %p 입니다.\n", &b);
printf("b의 값은 %p 입니다.\n", b);
printf("b의 참조값은 %d 입니다.\n", *b);
}
- 출력값
a의 주소값은 0x7ffeefbff54c 입니다.
a의 값은 5 입니다.
a의 주소값을 포인터 b에 대입합니다.
b의 주소값은 0x7ffeefbff540 입니다.
b의 값은 0x7ffeefbff54c 입니다.
b의 참조값은 5 입니다.
int **a;
와 같은 이중 포인터(double-pointer) 에 대해 생각해 보세요
포인터는 특정 변수의 주소를 가리키는 변수이다. 이중 포인터는 포인터변수의 주소를 가리키는 변수이다.
- 코드
#include <stdio.h>
int main()
{
int a = 5;
int *b = NULL;
int **c = NULL;
printf("a의 값은 %d 입니다.\n", a);
printf("a의 주소값을 포인터 b에 대입합니다.\n");
b = &a;
printf("b의 주소값을 이중 포인터 c에 대입합니다.\n");
c = &b;
printf("c의 주소값은 %p 이고 값은 %p 이고 참조값은 %p 입니다.\n", &c, c, *c);
printf("b의 주소값은 %p 이고 값은 %p 이고 참조값은 %d 입니다.\n", &b, b, *b);
printf("b의 참조값을 **c로 얻을 수 있습니다. %d\n", **c);
}
- 출력값
a의 값은 5 입니다.
a의 주소값을 포인터 b에 대입합니다.
b의 주소값을 이중 포인터 c에 대입합니다.
c의 주소값은 0x7ffeefbff538 이고 값은 0x7ffeefbff540 이고 참조값은 0x7ffeefbff54c 입니다.
b의 주소값은 0x7ffeefbff540 이고 값은 0x7ffeefbff54c 이고 참조값은 5 입니다.
b의 참조값을 **c로 얻을 수 있습니다. 5
int arr[3][3];
과 같은 배열은 내부적으로 어떻게 처리되는지 생각해보세요
먼저 연속된 메모리 공간을 할당하고 포인터를 사용해서 할당된 메모리 공간을 나눈다.
- 코드
#include <stdio.h>
int main()
{
int arr[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
printf("arr[0]은 arr[0][0]을 가리키게 된다.\n");
printf("%p %p\n", arr[0], &arr[0][0]);
printf("arr[1]은 arr[1][0]을 가리키게 된다.\n");
printf("%p %p\n", arr[1], &arr[1][0]);
printf("arr[2]은 arr[2][0]을 가리키게 된다.\n");
printf("%p %p\n", arr[2], &arr[2][0]);
puts("");
printf("%p %p %p\n", &arr[0][0], &arr[0][1], &arr[0][2]);
printf("%p %p %p\n", &arr[1][0], &arr[1][1], &arr[1][2]);
printf("%p %p %p\n", &arr[2][0], &arr[2][1], &arr[2][2]);
}
- 출력값
arr[0]은 arr[0][0]을 가리키게 된다.
0x7ffeefbff520 0x7ffeefbff520
arr[1]은 arr[1][0]을 가리키게 된다.
0x7ffeefbff52c 0x7ffeefbff52c
arr[2]은 arr[2][0]을 가리키게 된다.
0x7ffeefbff538 0x7ffeefbff538
0x7ffeefbff520 0x7ffeefbff524 0x7ffeefbff528
0x7ffeefbff52c 0x7ffeefbff530 0x7ffeefbff534
0x7ffeefbff538 0x7ffeefbff53c 0x7ffeefbff540
int* arr[3];
과 같은 배열이 가지는 의미는 무엇일까요?
일차원 포인터를 저장할 수 있는 배열이 생성된다.
- 코드
#include <stdio.h>
int main()
{
int a = 1, b = 2, c = 3;
int *p1 = &a, *p2 = &b, *p3 = &c;
int* arr[3];
arr[0] = p1;
arr[1] = p2;
arr[2] = p3;
printf("%d %d %d\n", *arr[0], *arr[1], *arr[2]);
}
- 출력값
1 2 3
'Layer7' 카테고리의 다른 글
팀프로젝트 보고서 (0) | 2019.07.14 |
---|---|
Git 보고서 (0) | 2019.06.12 |
리눅스 보고서 (0) | 2019.05.26 |
개인프로젝트 - Super Mario Bros. (4) | 2019.05.16 |
동적할당과 메모리구조 (0) | 2019.04.16 |