Layer7 포인터 과제

2020. 7. 1. 22:31Layer7

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