Computer Science
탄탄한 기반 실력을 위한
전공과 이론 지식 모음
Today I Learned!
배웠으면 기록을 해야지
TIL 사진
Flutter 사진
Flutter로 모바일까지
거꾸로캠퍼스 코딩랩 Flutter 앱개발 강사
스파르타코딩클럽 즉문즉답 튜터
카카오테크캠퍼스 3기 학습코치
프로필 사진
박성민
임베디드 세계에
발을 들인 박치기 공룡
임베디드 사진
EMBEDDED SYSTEM
임베디드 SW와 HW, 이론부터 실전까지
ALGORITHM
알고리즘 해결 전략 기록
🎓
중앙대학교 소프트웨어학부
텔레칩스 차량용 임베디드 스쿨 3기
애플 개발자 아카데미 1기
깃허브 사진
GitHub
프로젝트 모아보기
Instagram
인스타그램 사진

TIL

[250814] Day 4 - 포인터지옥 벌써 시작

sm_amoled 2025. 8. 15. 13:25

들어가며

내일 금요일이 광복절 공휴일이라 이번 주차는 평일 4일로 수업이 마감되었다.

주말간에 못들었던 강의도 좀 듣고 온더무드 개발도 빨리 진도를 빼고싶은데, 뭔가 놀고싶은 관성이 자꾸 올라오고있다. 동기가 부족한건지 아니면 실천력이 부족한건지… ㅋㅋㅋ

발은 좀 호전이 되고있다. 지금 거의 5일째 파스를 붙여두고 있어서 진통 효과가 올라온건진 모르겠지만, 다음주에 한 번 설렁설렁 운동 나가보고 어떤지 체크 + 센터 출발 시간 등도 한 번 체크해볼 예정이다. 후,,, 운동은 빼먹을 수 없지.

오늘의 키워드

포인터 장난질이 본격적으로 시작되었다. 생각보다 내가 모르고 있던 것들도 많더라. (중요하게 안짚고 넘어가서 그런지, 아니면 7년이 지나서 그런지)

가리켜라!!

배열 이름에 & 붙이기

배열명(포인터 상수)에 &를 붙이면 가리키는 주소는 같지만, 가리키는 대상이 달라진다.

char arr[80] = "hello";

printf("%d\\n", arr);
printf("%d\\n", &arr);

// >>> 실행 결과
// arr, &arr 이 같은 주소를 가지고 있음
11532080
11532080

printf("%d\\n", sizeof(arr));     // 배열자체를 가리키는 포인터 (포인터상수)
printf("%d\\n", sizeof(&arr));    // 배열 시작 주소를 가지는 포인터
printf("%d\\n", sizeof(*&arr));   // 다시 배열 가리킴
printf("%d\\n", sizeof(**&arr));  // char 가리킴

// >>> 실행 결과
// &arr는 배열 전체를 가리키는 포인터임 (&arr + 1이 2번째 원소를 가리킴) = 배열포인터
// 그러나 arr는 배열을 가리키고 있어 사이즈가 배열 전체임 (arr+1 이 다음 배열을 가리킴)
80
4
80
1

뭔가 동작이 내가 생각했던 것이랑 다른 것 같아서, 직접 +1을 한 값들을 한 번 찍어봤다.

sizeof(arr)

  • arr의 크기는 배열의 크기
  • arr&의 크기는 배열을 가리키는 포인터의 크기

arr 포인터 연산

  • arr+1 : arr 주소에 원소의 크기만큼 증가
  • &arr+1 : arr 주소에 배열의 크기만큼 증가
int arr[80] = { 1, 2, 3 };

printf("arr     %d\\n", arr);
printf("arr+1   %d\\n", arr+1);
printf("*arr    %d\\n", *arr);
printf("*arr+1  %d\\n", *arr+1);
printf("&arr    %d\\n", &arr);
printf("&arr+1  %d\\n", &arr+1);
printf("*&arr+1 %d\\n", *&arr+1);

// >>> 실행 결과
// 주소에 더하기 연산 시 원소타입의 크기만큼 증가
arr     19920932
arr+1   19920936
// 값 접근 시 원소에서 증가
*arr    1
*arr+1  2
// 배열의 주소에 더하기 연산 시 배열의 크기만큼 증가
&arr    19920932
&arr+1  19921252
// 배열의 주소에 있는 값에 더하기 == arr+1
*&arr+1 19920936

sizeof 랑 배열포인터가 정 반대의 동작을 하니, 주의하기!

그렇게 이걸 알아내려고 근 3시간동안 뚝딱대며 노력하고 있었는데, 강사님이 지금에서야 이야기를 해준다….

배열의 이름은 딱 2가지 경우에만 첫 요소를 가리키는 포인터가 아닌 배열로서 동작한다. 요건 외워줄 것…

  • sizeof(배열명) ⇒ 배열의크기
  • &배열명 ⇒ 배열자체를 가리키는 포인터

코테 준비에 도움되기

	// 파일을 열어서, 읽어온 내용을 stdin으로 변환해 사용하기
	// txt에 데이터를 넣어두면 이걸 입력으로 받도록 할 수 있음.
	freopen("input.txt", "r", stdin);
	// 반대로, 이렇게 하면 stdout으로 나가는 출력을 파일에 작성할 수 있음.
	// 프로젝트 파일에 바로 추가가 되지는 않으니, 프로젝트 폴더 찾아가서 열어봐야함.
	freopen("output.txt", "w", stdout);

위 코드를 main 안에 넣어주면 콘솔을 통한 입출력을 파일을 통한 입출력으로 변경할 수 있음. 코테 로컬환경에서 작성하면서 만약에 입출력이 많으면 이 방법으로 수월하게 처리할 수 있음!

함수 이름도 포인터

함수 이름도 배열이름처럼 포인터다. 함수의 주소를 파라미터로 넘기거나 포인터 변수처럼 다룰 수 있다.

고수준 언어에서 함수의 파라미터로 다른 함수를 넘기듯이 활용하면 유용할 것 같다!

 

뭔가 설계 테크닉적으로 자주 나올 것 같아서, 조금 익숙해질 필요가 있을 것 같다.

개고생

이걸 정확하게 분석하는 방법을 좀 연구해봐야할 것 같음! 어렴풋이 감은 잡았는데, 정확도를 높이는 연습을 하자.

320x100