혼자 공부하는 C 언어 - 배열 포인터

Поделиться
HTML-код
  • Опубликовано: 4 фев 2025

Комментарии • 16

  • @5959ccc
    @5959ccc Год назад

    포인터강의 감사합니다

  • @김석현-k1o
    @김석현-k1o 3 года назад +2

    여러 동영상을 봐도 포인터에 대한 개념이 잘 잡히지 않았는데, 그림으로 쉽게 설명해주시니 이해가 잡히네요.
    감사합니다.

    • @clecture
      @clecture  3 года назад

      영상이 도움이 되셨다니 기쁘네요. 배열 포인터를 포함한 응용 포인터는 어렵지만 하나씩 이해 되기 시작하면 재밌고 뿌듯하지요:)

  • @심스틸러-q5j
    @심스틸러-q5j 2 года назад +1

    이거 보고 배열 포인터가 뽝 이해되었습니다. 감사합니다 :)

    • @clecture
      @clecture  2 года назад

      배열 포인터 이해했으면 포인터 95%는 이해한거죠 :0

  • @joshpark7001
    @joshpark7001 2 года назад +1

    0:50 int형이니까 4byte씩 늘어나는 건 이해가 되는데 그러면 100번지에서 시작하면 100,104,108,112, 그리고 다음은 116이 되어야 하는거 아닌가 생각했는데 115가 ㅇ나오는게 이해가 되지 않습니다...ㅠㅠㅠ 선생님 설명한번만 해주실수 있으신지요...

    • @clecture
      @clecture  2 года назад +1

      메모리는 바이트 단위로 주소값이 있습니다. 따라서 4바이트의 시작 바이트 번지가 100번지라면 각 바이트의 번지는 100, 101, 102, 103번지가 됩니다. 마찬가지로 첫번째 행의 마지막 4바이트의 시작 주소가 112번지라면 각 바이트의 주소는 112, 113, 114, 115번지가 되므로 마지막 바이트의 주소를 115번지로 표시했습니다. 아마도 시작 번지를 표시하다 끝나는 번지를 표시하니 살짝 오해하신 듯 하네요:) 물론 다음 행의 첫 번째 시작 번지는 116번지로 시작합니다.

    • @joshpark7001
      @joshpark7001 2 года назад +1

      @@clecture 아하 바로 이해했습니다!! 감사합니다 선생님!

  • @히히-o1s
    @히히-o1s 2 года назад +1

    좋은 영상 감사합니다
    4:00 정도부터 a+1이 116번지인건 알겠는데 *(a+1)이 배열명을 나타낸다는게 잘 이해가 안갑니다 *는 내용물 나타내는 간접지정연산자 아닌가요?

    • @clecture
      @clecture  2 года назад +1

      참 쉽지 않은 질문인데요. 변수부터 개념을 잡아야 할 것 같습니다. 예를 들어, int a = 10; 이렇게 변수가 선언되어 있을 때 &a는 a의 주소고 그 주소에 * 연산을 수행하면 다시 변수가 됩니다.
      즉 *(&a) 는 변수 a의 값 10이 아니고 변수 a가 되는 것이지요. 변수는 공간과 값의 2가지 기능을 할 수 있으므로 변수 a와 그 안의 값 10은 다른 겁니다. 배열명도 첫 요소의 주소 기능과
      배열 전체를 뚯하는 변수로의 기능 2가지가 있는데요. a+1이 두 번째 부분배열 a[1]의 주소이므로 그 주소에 * 연산을 수행한 *(a+1)은 결국 부분배열 a[1]이 된다는 뜻입니다. 이 후에 이 부분배열명 a[1]이 a[1] 부분배열의 첫 요소의 주소가 될 수도 있고 a[1]배열 전체를 나타내는 변수로의 기능을 할 수도 있습니다. 그 것은 그 이후의 연산에 따라 달라집니다.

    • @히히-o1s
      @히히-o1s 2 года назад +1

      @@clecture 빠른 답변 감사합니다
      int a=10 에서 a가 1. 변수 그자체 공간의 이름 2. a 안의 값 10 두 가지를 의미 하듯이
      *(a+1)은 1. 배열 그자체 공간 이름 2. 배열의 시작주소 두 가지를 의미
      *는 단순히 내용을 가리키는 연산자가 아니고 해당 주소값을 시작주소로 갖는 변수를 나타낸다고 생각하면 될까요?

    • @clecture
      @clecture  2 года назад +1

      네 맞습니다 :) 어떤 대상의 주소에 간접참조연산(*)을 수행하면 그 대상이 되는 것이죠. 변수의 주소에 *을 붙이면 변수가 되고, 배열의 주소에 *을 붙이면 배열이 되고, 함수의 주소에 *을 붙이면 함수가 되는 것이지요. 포인터는 사실 정말 쉬운데요. * 연산을 통해 구한 대상에 대한 이해가 부족해서 포인터를 제대로 사용하지 못하는 경우가 많습니다. 변수도 공간과 값 2가지 기능이 있는데 변수의 주소에 *를 사용하면 그 변수의 값을 구해준다고 생각하기 쉽거든요. 배열 포인터도 2차원 이상의 배열에서 사용하는데 2차원 배열에 대한 이해가 부족하면 포인터가 어려운 것으로 오해할 수 있습니다.

  • @jhpark8624
    @jhpark8624 3 года назад +1

    안녕하세요. 선생님께서 쓰신 '혼자 공부하는 C언어' 를 보면서 C언어를 공부하는 학생인데요.
    2차원배열의 배열명인 a는 첫번째 배열 요소의 주소값이므로
    a+1 이라는 연산을 수행했을 때 그 다음 배열요소인 2번째 행으로 가게되어 116이라는 주소값을 나타낸다는건 잘 이해가 되는데요.
    여기에 * 연산자를 취해서 *(a+1) 이 되면 두 번째 행 전체를 쓸 수 있게 된다는게 무슨 의미인가요?
    그래서 *(a+1)+2 을 해주면 두 번째 행의 3번째 열을 가리킨다는게 잘 이해가 안되요ㅜㅜ
    그냥 제 스스로 이해를 해보자면
    *(a+1) 이 두 번째 행 전체를 쓸 수 있다는 말은 *(a+1) 이 두 번째 행의 배열명이 된다는 의미로 해석하고,
    그래서 배열명이 첫 번째 배열 요소의 주소값이므로 *(a+1) 은 2번째 행의 첫 번째 열의 주소값을 가진다고 꾸역꾸역 생각해보았는데...
    그러면
    a+1 이 가리키는 자료형은 int[4] 이고
    *(a+1) 를 했을 때 , int[4]를 가리키는 주소값에서 int형 하나을 가리키는 주소값으로 바뀌었다는 말인데...
    이런 관계를
    잘 모르겠어요 선생님 ㅜㅜㅜ

    • @clecture
      @clecture  3 года назад +1

      거의 90프로는 이해하셨네요:) 오늘 중으로 자세한 답변 달아드릴게요~

    • @clecture
      @clecture  3 года назад +1

      a+1 이 가리키는 것은 int[4]형의 1차원 배열이죠. 여기에 별(*)을 붙인 *(a+1)은 int[4]형 1차원 배열이되고 결국 *(a+1) 요 표현식은 1차원 배열의 배열명으로 쓰입니다. 여기까지 이해하셨으면 그 다음이 중요한데요. 배열명은 그 배열의 첫 요소의 주소로 쓰일 수 있으므로(주소가 아니라 주소로 쓰일 수 있음) *(a+1)은 int형 하나의 주소값이 될 수 있습니다. 즉 int[4]형을 가리키는 주소 a+1에 별(*)을 붙이면 int형을 가리키는 주소가 되는 것이 아니라 int[4]형의 배열(명)이 되었다가 그 배열명이 int형의 주소로 쓰일 수 있다는 뜻입니다. 배열명은 첫 요소의 주소 상수의 기능과 배열 전체를 뜻하는 자료형의 기능 두 가지를 갖고 있습니다. 따라서 배열명 *(a+1)이 첫 요소의 주소 상수로의 기능을 한다고 단정지어서는 안됩니다. 배열명에 어떤 연산을 수행하느냐에 따라 주소로 쓰일 수도 있고 배열 전체를 뜻하는 변수로의 기능을 할 수도 있거든요. 우리가 코드에서 별(*)만 보고 곱하기를 하는 것인지 포인터 연산을 하는 것인지 알 수 없듯이 *(a+1)이 int형의 주소라고 생각해선 안됩니다. *(a+1)은 결국 int형의 주소가 아니라 int[4]형 배열(명)인 것이죠. 그리고 나서 *(a+1) + 2 와 같이 2를 더하는 연산을 수행하면 컴파일러는 배열명 *(a+1) 이것이 갖는 두 가지 기능 중에 첫 번째 기능인 주소 상수(첫 요소의)로서의 기능을 수행하여 2번째 행의 시작 주소에서 옆으로 주소계산을 하게 됩니다.

    • @jhpark8624
      @jhpark8624 3 года назад

      @@clecture빠른 답변 해 주셔서 너무 감사드립니다. 지금 유튜브에 올라와 있는 혼공C 강의 들으면서 책이랑 같이 공부 중인데, 너무 큰 도움 되고 있습니다. 선생님이 판서해주신 배열명이 가지는 2가지 의미를 교재에 받아 적어 놓고도 , 개념을 잘 연결시키지 못 했었네요. 이제 너무 잘 이해되었습니다!! 매번 좋은 강의 올려주셔서 감사합니다^^ 수고하세요 :)