[👉포인터 2]포인터와 함수 - call by value(값 전달) Vs call by address(주소 전달) - 포인터의 활용

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

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

  • @뇽-x5l
    @뇽-x5l Месяц назад +1

    정말 너무너무 감사합니다 수업들으면서 너무 어렵고 이해가 안되고 헷갈려서 유튜브 강의 찾고 있었는데 이 강의 들으니까 포인터가 너무 쉬워보여요 정말 감사합니다 영상보다가 너무 감사해서 댓글을 안 쓸 수가 없었네요 진심 감탄만 나와요... 헷갈리는 것들 족족이 다 잡아서 설명해주시는 거 보고 깜짝놀랐어요 너무 행복하네요.... 정말정말 감사합니다!!!! 제발 저희학교 교수님이 되어주세요...ㅠㅠㅠㅠㅠ

    • @withhoneyc
      @withhoneyc  Месяц назад

      제 강의가 이해가 잘 되신다니 저도 넘 기쁘네용~🤗 정말 감사 드립니다~

  • @라면-f3i
    @라면-f3i 2 месяца назад +1

    한마디 한마디 불필요한 말이 없네요. 잘 들었습니다. 감사합니다.

    • @withhoneyc
      @withhoneyc  2 месяца назад +1

      와! 대단하시네요!
      강의를 하루에 몇 개를 들으시는거예요??
      저도 제 강의 그렇게 못 듣는데 ㅎㅎㅎ

    • @라면-f3i
      @라면-f3i 2 месяца назад +1

      @@withhoneyc 매순간 깨닫는 기쁨이 있다보니까 많이 듣는 게 별로 힘들지가 않네요 ㅎㅎ 자료구조&알고리즘 목록 보다가 중간중간 필요해보이는 내용있으면 넘어가서 듣고 또 넘어가서 듣고 그러다보니 이거 결국엔 선생님 강의 다 듣겠어요 ㅎㅎ

  • @정태원-c1y
    @정태원-c1y 3 месяца назад +1

    감사합니다!

  • @what_ihav
    @what_ihav Год назад +3

    강의 폼 미쳤습니다😮😮😮

  • @지호-z6g
    @지호-z6g 9 месяцев назад +1

    강의 감사합니다 ! 덕분에 잘듣고있어요 요번주안으로 C끝내려구요 !

    • @withhoneyc
      @withhoneyc  9 месяцев назад

      와우! 멋지시네요👍👍
      꼬옥 목표 달성 하시길 바라용:)

  • @jhKim-p6g
    @jhKim-p6g 2 месяца назад +1

    어쩜 이렇게 설명을 잘 하시는지? 많이 감사 합니다... ^^

    • @withhoneyc
      @withhoneyc  2 месяца назад

      저도 많이 감사합니다~🙏

  • @jayjayhh8600
    @jayjayhh8600 6 месяцев назад +1

    선생님 진짜 너무 감사합니다 😭

    • @withhoneyc
      @withhoneyc  6 месяцев назад

      저도 너무너무 감사합니다~😊

  • @sunwookim3004
    @sunwookim3004 Год назад +1

    포인터랑 구조체, 연결 리스트 반복해서 듣고 있습니다. 감사합니다 ㅎ

  • @이지원-s5u3s
    @이지원-s5u3s Год назад +1

    너무 좋은강의 만들어주셔서 감사해요~ 많은도움이 되고있습니다😊

    • @withhoneyc
      @withhoneyc  Год назад

      잘 들어 주셔서 저도 넘 감사합니다😊

  • @alphago410
    @alphago410 5 месяцев назад +1

    선언된 전역변수는 컴파일때 인덱스로 치환돼 로딩시에 가장면저 할당하지만
    함수내에 선언된 변수는 static 이라 해도 그 함수가 호출되기 전에는 아직은 존재하지도 않습니다.
    즉 지역변수, 매개변수는 함수가 호출되면 그제서야 생성되고 이후 함수종료와 함께 께끗히 소멸됨.
    단 static 속성이 붙은것은 따로 전역변수 영역에 추가돼 코드실행이 종료될때까지 보관돼 유효함.

  • @킴키-o1y
    @킴키-o1y 11 месяцев назад

    감사합니다😊

    • @킴키-o1y
      @킴키-o1y 11 месяцев назад

      call by value와 코딱지. . .

  • @서민정-d9e9h
    @서민정-d9e9h 6 месяцев назад +2

    막막했는데 진짜 설명 최고십니다 ㅠㅠㅠ 잘들었습니다 감사합니다

    • @withhoneyc
      @withhoneyc  6 месяцев назад

      제 강의가 도움이 되신다니 너무 좋네요~감시합니다!!!

  • @jaekunyoo8509
    @jaekunyoo8509 Год назад

    안녕하세요. 감사히 잘 봤어요.
    새벽까지 C공부하다가 몇시간 자고서 냉방기 수리 예약으로 일하러 갈때 포인터 재생목록 영상들 많이 들었는데 설명을 잘해주셔서 운전중에도 이해가 쉬웠어요.
    자는 시간, 운전시간이 아까울 정도로 재미있는데 젊었을 때 전혀 모르고 막연히 어려운 거라고 생각했지요.
    재미있게 열심히 하는거는 좋은데 수학기반이 없어서 처리방식(알고리듬) 따라가기가 힘들거같아요. 열심히 외워야겠지요.
    2023년 8월 14일 월 19시44분 태평양 시간

    • @withhoneyc
      @withhoneyc  Год назад +1

      외우지 마시고^^ 이해 하시면 더 빠를 거 같아요!! 일하시면서 공부하시다니 정말 대단 하시네요😊

  • @KS_UntilEndOfTheDay
    @KS_UntilEndOfTheDay Год назад

    코딱지 .... 에서 바로 구독 눌렀습니다.. ^^* 좋은 강의 고맙습니다.

    • @withhoneyc
      @withhoneyc  Год назад

      아니 ㅋㅋㅋㅋ 코딱지는 왜 나왔죠??? 감사합니다🙏

  • @kwohyuno3877
    @kwohyuno3877 Год назад +2

    설명 너무 깔끔하고 쉬운 것 같아요 선생님!
    현직 개발자신가요 아니면강사님이신가용?

    • @withhoneyc
      @withhoneyc  Год назад

      감사합니다😊 전 강사예요!!!

  • @김코봉-v4w
    @김코봉-v4w 6 месяцев назад

    궁금한게있습니당! 제가이해가부족한건지 몰라도
    포인터변수선언하고 아래함수에서
    *p1 *p2로 변경하면 복사가되서
    값이변경되는거면 call by value가 아닌가요ㅠ?
    저렇게쓰고출력하면 a b값자체가바뀌는거같아서..
    #include
    void Swap(int* ptrA, int* ptrB);
    int main(void)
    {
    int num1 = 10, num2 = 20;
    int* ptr1 = &num1;
    int* ptr2 = &num2;
    printf("%d %d
    ", num1, num2);
    printf("%d %d
    ", *ptr1, *ptr2);
    Swap(&num1, &num2);
    printf("%d %d
    ", num1, num2);
    printf("%d %d
    ", *ptr1, *ptr2);
    return 0;
    }
    void Swap(int* ptrA, int* ptrB)
    {
    int tmp = *ptrA;
    *ptrA = *ptrB;
    *ptrB = tmp;
    }
    요러케요!

    • @withhoneyc
      @withhoneyc  6 месяцев назад

      이 경우 num1과 num2가 변경되는 것이 맞습니다. 변수를 함수의 인수로 넘기는 경우 변수의 주소를 넘기게 되면 변수의 값의 수정이 가능합니다.
      이 경우 call by address입니다.

  • @piewow8259
    @piewow8259 4 месяца назад

    첨접하면 매개변수 전달하는게 어려워요...

  • @푸우우-m1u
    @푸우우-m1u 11 месяцев назад

    &a, &b는 각각 변수 a와b의 '주소'를 나타내는 것이고 int *p1, int *p2 는 주소를 가르키는 '포인터'인데 종류가 다름에도 인수와 매개변수의 관계로 엮을 수 있나요? 함수에서는 인수가 상수이거나 변수이고 매개 변수도 역시 변수여서 연결되는 것이 이해가 되었는데 포인터를 함수에서 활용할 때는 인수로 '주소'를 넘긴걸 매개변수가 '포인터'로 받는게 조금 이해가 안됩니다

    • @withhoneyc
      @withhoneyc  11 месяцев назад

      주소를 넘기면 포인터가 주소를 저장합니다. 정수를 넘길 시 int형 변수가 정수를 저장하는 원리와 같습니다.

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

    #include
    void swap1(int* a, int* b) {
    int* temp;
    temp = a;
    a = b;
    b = temp;
    }
    void swap2(int* a, int* b) {
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
    }
    int main() {
    int a = 10, b = 20;
    swap1(&a, &b);
    printf("a value : %d, b value : %d
    ", a, b);
    swap2(&a, &b);
    printf("a value : %d, b value : %d
    ", a, b);
    return 0;
    }
    코드는 함수를 이용한 두 숫자를 바꾸는 간단한 코드입니다.
    swap2는 주소는 변경되지 않고, 주소값만 변경하여 출력하는 부분이라 이해는 되는데...
    swap1은 주소 자체를 변경하였는데, 출력하는 a, b 값은 그대로 10, 20 그대로네요.
    왜 변경되지 않는 거죠? 정확하고 자세한 설명 부탁드려도 될까요?
    (swap1과 swap2의 차이점의 자세한 설명)
    친절한 답변에 미리 감사드립니다.~

    • @withhoneyc
      @withhoneyc  2 года назад +2

      a와 b는 포인터로 swap1에서 선언된 지역변수 입니다. 지역변수는 함수가 종료되면 메모리상에서 사라집니다. swap1함수 내에서 a, b의 주소가 변경 되지만 , 그건 main함수의 a,b가 아닌 swap1에서 선언된 지역변수가 바뀌게 됩니다.

    • @jaekunyoo8509
      @jaekunyoo8509 Год назад

      안녕하세요. 오래돼서 보실지 모르지만 제가 초보로 궁금해서 실험해 봤어요.
      지금까지 배운바로 교체함수를 분석해 볼게요.
      void swap2(int* a, int* b) // 선언문에서 자료형과 함께 별을 붙여 그 자료형의 포인터 변수라고 지정하고
      { // 실행문에서는 일반 변수들도 int a, int b, char x, double y라고 안 쓰고
      int temp; // 자료형 생략하고 a, b, x, y로 쓰듯이
      // 포인터 변수도 별을 안 붙이고 사용한다
      temp = *a; // 포인터 변수가 point(지시, 지적)하는 주소내의(주소의) 값을 참조하려면
      *a = *b; // 이 때 별을 붙여 (간접)참조한다(자신의 변수명에 부여된 주소의 값인 지적하는 주소가 아닌,
      *b = temp; // 지적하는 주소(내)의 값을 읽어온다)(혀니C 선생님: 역참조한다)
      } // 포인터 변수의 값은 지적하는 주소, 주소값(X 지적하는 주소의 값, X 지적하는 주소내의 값)
      실체없이 서로의 상상이 다르면 정확한 전달이 안되니 비유를 하면,
      a라는 이름의 변수를 기억용량(memory size)을 아껴 쓰기 위해 크기가 다른 자료형, 문자는 1개형, 정수는 4개형, 실수는 8개형으로 구분하여 지정(선언)하여 값을 대입하면 기억소자(memory)에 임의의 공간이 할당되어 값이 저장되고 그 첫자리 주소를 사용하는데, 한 층이 몇 백호가 있고 몇 백층인 큰 아파트로 생각하면 301호에 할당되었으면 문자는 301호 한 집에 'C'를 보관(기억, 저장)하고, 정수형은 304호까지 네 집에 '123456'을 저장하고, 실수형은 308호까지 여덟 집에 '3.141592'를 쓰는데(방 한구석만 차지하는 용량이라 낭비가 심해도 세세하게 제어를 못하고, 네 집에 꽊차는 용량일 수도 있으니) 주소는 301호로 첫 집의 주소를 이용한다.
      포인터 변수 b에 선언시에만 별을 붙여 *b로 포인터라 표시하여 지정하여 a의 주소를 지시, 지적, point하면 기억소자 아무데나인 115호에 여덟 집(어느 주소를 가르킬지 몰라서 가장 큰 수의 용량을 사용)이 할당되어 그 집에는 a의 주소인 '301호'가 저장되고 'C'나 '123456'이나 '3.141592'의 값이 저장되지 않는다. 실행문에서는 301호 주소만을 가르킬 때는 일반 변수와 같이 b로 쓰는데 포인터 변수 b를 이용하여 일반 변수 a의 값을 읽어오려면 다시 별을 붙여서 읽겠다는 표시를 하여 *b로 써서 자신의 주소값을 참조하여 115호를 읽는 것이 아닌 그 주소의, 주소내의 값인 지적하는 주소 301호의, 주소 301호 내의 값인 'C'나 '123456'이나 '3.141592'를 읽어오게하거나 바꾸게 하여 간접참조(역참조)라 한다.
      배열은 같은 자료형의 자료들을 연속해서 저장하는 방식이니(일반 할당은 각각 임의의 공간에 되니) 문자형 10개는 301호부터 310호까지, 정수형 10개는 네 집 한단위가 10개니 340호까지, 실수형은 여덟 집 단위 10개 380호까지 할당되어 문자형은 다음 집이 302, 303 등 이고, 정수형은 305, 309 등 이고, 실수형은 309, 317 등 이 된다. 배열의 표기는 a[10]으로 a, a[0]의 주소는 첫자리 301호로 같으니 포인터 변수 b와 같다. 문자형은 다음 집 302호도 a[1], a + 1도 b + 1과 같은 방식이고, 정수형은 다음 집이 네 집 건너뛴 305호가 a[1], a +1, b + 1로 3개가 같다. 실수형이나 행렬도 같은 방식이다.
      얼마나 잘 표현됐는지, 전달되는지 모르지만 초보의 해석이에요.
      군대 제대한 90년초에 MS-DOS 3.3부터 썼는데 RAM인 Conventional memory가 640 kB였고 한참 후 upper memory area (UMA)를 사용하게 되어 1,024kB(1MB)였으니 C언어 초기 1970년대에는 훨씬 작았겠지요. HDD도 20MB 정도였고 플로피 디스크, 하드 디스크를 컴퓨터에서 여기저기 아무 곳에나 저장해서 한군데로 몰아야 빨리 읽는다고 Norton Utility의 Defragment로 드륵드륵 하면서 자주 사용했어요.
      void swap1(int* a, int* b) { //
      int* temp; //
      temp = a; // temp = *a; *temp = *a;
      a = b; // *a = *b;
      b = temp; // *b = temp; *b = *temp;
      }
      swap1에서 temp를 왜 pointer 지정하셨는지 모르겠고,
      문제는 a, b 각 변수를 선언문에서는 별을 붙여서 포인터 지정하시고는///void swap1(int* a, int* b)///
      실행문에서는 별을 붙여서 주소값을 참조하셔야(읽어오셔야) 했는데///temp = *a; *a = *b; *b = temp;///
      별들이 없으니///temp = a; a = b; b = temp;///
      값들만 읽어와서(혀니C 선생님 표현: 원본 a, b의 값들을 복사해와서) 변하지 않았어요.
      참고로 포인터 지정된 temp를 실행문에서 별을 붙여 그 주소내의 값을 읽어오던, 안 붙여도 그 변수의 값을 읽어오던 정확히 동일한 값, 물건이니 교체를 잘 했어요.
      이름 대로 임시로 장소를 제공하여 값들을 옮기는 데 쓰는 용도의 매개(자신은 변하지 않는)장소이니 전달하는(지나쳐 가는) 값만 정확하면 되겠지요.
      수정후 실행하면 swap1에서 제대로 교체되고 swap2에서 다시 교체되어 원래 값들이 나와요.
      printf("SWAP1 - a value : %d, b value : %d
      ", a, b); 이렇게 명찰을 달면 구분하기 더 쉽지요.
      2023년 8월 14일 월 19시19분 태평양시간