책 내용 질문하기
2023 정보처리기사 필기 2권 81 페이지 기출문제 1번, 3번
도서
2023 시나공 정보처리기사 필기
페이지
81,82
조회수
113
작성일
2025-02-11
작성자
이*경
첨부파일

안녕하세요.

44p [135섹션 데이터 입•출력] 에서


prinf() 함수에는 printf(서식 문자열, 변수) 형태로 쓰는데

이때 변수에 &주소연산자를 붙이지 않는다고 배워서요.


그런데, 81p [139섹션 포인터] 기출문제 1번에서

prinf("%d", &n + *pt - *&pt + n);

이런식으로 문제가 나왔는데, 주소연산자를 붙이면 안되는데 잘못 붙어있다.가 아니라,

n변수의 주소 값(예 1000) 이렇게 주소값을 나타날때 쓴다고 하셔서 헷갈립니다.


출력함수에서 &이 붙어있을때는 포인트값을 가지는 역할을 가진다고 외우면 될까요?


_____________


82p 기출문제 3번에서

포인터와 배열이 좀 헷갈립니다. 포인터가 배열을 만났을때 쓰는 형식은 일반 변수와 쓸때랑 달라지나요?

str1[1] = p2[2];

의 경우, 배열str1의 두번째 값으로 앞은 이해가 되는데. *을 쓰지 않았는데도 해당 포인터의 위치값을 바로 찾아가서 대입하는 걸까요?


*p2[2]는 해당 포인터가 가리키는 배열을 찾아가 그곳에 있는 값을 부르는 걸로 바로 이해가 되는데.

p2[2]가 해당 포인터가 가리키는 배열의 세번째 변수주소가 아니라.

(예를 들면 p2[0]이 100번지면, p2[2]는 102번지(char형)) <-이게 아니라 p2[2]의 위치에 있는 값인거죠?


배열은 간접 연산자*를 생략하기도 하는건가요? 아니면 원래 배열은 안 붙이고도 쓰나요?ㅠㅠ

답변
2025-02-11 19:42:39

안녕하세요 길벗수험서 운영팀입니다.

printf("%d", &n + *pt - *&pt + n);


수식에서 &n 는 n의 주소값 입니다


int* pt = NULL; <--- 이코드에서 pt라는 포인터 변수를 만들었습니다

*pt 는 pt라는 포인터 변수가 가리키는 곳을 말하는데 pt라는 포인터변수는 주소값 1000을 가지고 있었고

*pt는 1000번지가 가르기는곳의 값을 의미하므로 4 입니다


*&pt 에서 &pt는 포인터 변수 pt의 주소 2000번지를 의미하고

맨앞에 *이 붙어있으니 주소 2000가 가리키는 곳의 값(1000)을 의미합니다


int n = 4; <--- 이코드에서 n에 4를 넣어 초기화 했으니

n은 n변수가 가지고 있는 값 4를 말합니다


&는 주소를 말하는것입니다

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

아래 코드에서 빨간색으로 표시한 부분을 보세요

p1 = str1; 이렇게 되어있습니다.

여기서 str1이라는것은 배열의 이름입니다.


p1 = str1; 이렇게 배열의 특정위치의 값을 넣는것이 아니라 srt1이라고"배열의 이름"을 써서 p1에 넣어라 라고 하면 str1 배열의 시작주소를 p1에 저장을 합니다

str1배열이 만들어질때 100번지에 만들어졌다면

p1에 str1의 시작위치 100번지가 지정이 됩니다.


이때 p1과 str1은 같은 주소값을 같습니다

둘다 같은 주소를 가지고 있으니

p1[0]과 srt1[0]은 같은곳 입니다

p1[1]과 srt1[1]은 같은곳 입니다

p1[2]과 srt1[2]도 같은곳 입니다


좀더 쉽게 말을 하면 예를들어 시나공에서 사옥으로 사용하기 위해 하나의 건물을 새로 지었다고 가정을 했을때

건물이 완공되면 그건물을 사옥으로 사용할것이고 사람들은 시나공이 건물이라고 부르겠죠

이렇게 건물에 이름을 붙이것이 변수 또는 배열이라고 생각히시면 됩니다.

그리고 그건물에는 당연히 주소가 정해져 있겠죠


친구한테 시나공 건물 앞에서 만나자~~ 라고 말을 하던

그건물의 주소를 알려주고 그 주소에서 만나자~~ 라고 말을 하던 동일한 위치에서 친구를 만날수 있습니다


행복한 하루되세요 :)

  • 관리자
    2025-02-11 19:42:39

    안녕하세요 길벗수험서 운영팀입니다.

    printf("%d", &n + *pt - *&pt + n);


    수식에서 &n 는 n의 주소값 입니다


    int* pt = NULL; <--- 이코드에서 pt라는 포인터 변수를 만들었습니다

    *pt 는 pt라는 포인터 변수가 가리키는 곳을 말하는데 pt라는 포인터변수는 주소값 1000을 가지고 있었고

    *pt는 1000번지가 가르기는곳의 값을 의미하므로 4 입니다


    *&pt 에서 &pt는 포인터 변수 pt의 주소 2000번지를 의미하고

    맨앞에 *이 붙어있으니 주소 2000가 가리키는 곳의 값(1000)을 의미합니다


    int n = 4; <--- 이코드에서 n에 4를 넣어 초기화 했으니

    n은 n변수가 가지고 있는 값 4를 말합니다


    &는 주소를 말하는것입니다

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

    아래 코드에서 빨간색으로 표시한 부분을 보세요

    p1 = str1; 이렇게 되어있습니다.

    여기서 str1이라는것은 배열의 이름입니다.


    p1 = str1; 이렇게 배열의 특정위치의 값을 넣는것이 아니라 srt1이라고"배열의 이름"을 써서 p1에 넣어라 라고 하면 str1 배열의 시작주소를 p1에 저장을 합니다

    str1배열이 만들어질때 100번지에 만들어졌다면

    p1에 str1의 시작위치 100번지가 지정이 됩니다.


    이때 p1과 str1은 같은 주소값을 같습니다

    둘다 같은 주소를 가지고 있으니

    p1[0]과 srt1[0]은 같은곳 입니다

    p1[1]과 srt1[1]은 같은곳 입니다

    p1[2]과 srt1[2]도 같은곳 입니다


    좀더 쉽게 말을 하면 예를들어 시나공에서 사옥으로 사용하기 위해 하나의 건물을 새로 지었다고 가정을 했을때

    건물이 완공되면 그건물을 사옥으로 사용할것이고 사람들은 시나공이 건물이라고 부르겠죠

    이렇게 건물에 이름을 붙이것이 변수 또는 배열이라고 생각히시면 됩니다.

    그리고 그건물에는 당연히 주소가 정해져 있겠죠


    친구한테 시나공 건물 앞에서 만나자~~ 라고 말을 하던

    그건물의 주소를 알려주고 그 주소에서 만나자~~ 라고 말을 하던 동일한 위치에서 친구를 만날수 있습니다


    행복한 하루되세요 :)

· 5MB 이하의 zip, 문서, 이미지 파일만 가능합니다.
· 폭언, 욕설, 비방 등은 관리자에 의해 경고없이 삭제됩니다.