C언어 복습

C언어 복습 17 (배열과 포인터)

Captic 2019. 7. 16. 19:59

참고: 정덕 - <컴맹을 위한 C언어>

♨ 개인적 해석이 다분한 글임으로, 인지하지 못한 오류가 있을 수 있습니다 

 

▣ '배열이름'이 '배열의 첫 요소 포인터'로써 인식될 수 없는 상황들

 - 배열이름[인덱스] ≠ *(배열이름+인덱스) 인 경우

  ①배열이름이 주소연산자의 피연산자로 쓰인 경우

       &배열이름


  ②sizeof연산자의 피연산자로 쓰였을 경우

       sizeof(배열이름)


  ③char 배열을 초기화할때 문자열이 쓰였을 경우

       char 배열이름[]="HelloWorld";

 

▣ 포인터 배열
 - 배열인데 요소가 포인터

 - 원시 자료형(int, float 등) 배열 선언 

      자료형 배열이름[개수]

   예) int arr[10];

 

 - 포인터배열 선언

    포인터형  배열이름 [개수];

  예) char* charArr[10];

 

▣ 함수 포인터

 - 말 그대로 함수의 포인터(주소)

 

printf의 주소를 printf해보았다 그의 주소를 획득했다

  printf함수 자체를 인수로 참조 -> 함수의 시작주소 참조

 

 - 함수의 시작주소란?

    -> 프로그램 실행시키면 그 프로그램이 보조기억장치에서 주기억장치(메모리)로 복사

       이때, 코드 영역/ 데이터 영역/ 스택 영역으로 나위어 복사

 

       ①코드 영역: 프로그램에서 실행해야 될 명령어들이 들어가는 영역

       ②데이터 영역: 전역변수가 들어가는 영역과 힙 영역, 즉 데이터가 들어가는 영역

       ③스택 영역: 함수의 지역변수나 인자등이 들어가는 영역('함수의 영역'이 생성되고 소멸되는 영역)

 

   함수의 지역변수는 스택영역에 저장, 함수의 내용은 코드영역에 있다

 

 함수포인터

 - 함수포인터 변수를 선언할 때 필요한 정보

   ① 함수포인터 변수 이름

   ② 인자형태

   ③ 반환값의 형태

 

                ③반환자료형①(*변수이름)②(인자자료형);

             예) int (*fn) (int, int);

 

  fn은 함수포인터 변수, fn에 담기는 함수가 파라미터(인자)를 int형 2개를 갖는다면

  fn은 int 2개를 인자로 가져야 한다

 

예) 함수포인터 변수 사용예

add함수를 함수포인터 fn에 담아서 add대신 fn을 사용하여 10과 20을 합쳐보았다

 - 일반 포인터의 경우 역참조연산자를 이용하면 포인터가 가리키는 데이터를 참조할 수 있다

   그러나 함수포인터에는 역참조연산자를 사용할 필요가 없다 위의 예제와 같이 함수포인터 변수를 초기화했으면

   원래 함수를 호출하듯이 사용 가능

 

 포인터에 관한 주의사항

 1. 포인터가 가리키는 것의 자료형을 엄격히 구분 -> 배열이라면 무엇이 몇개 들어있는지 까지

 2. 연산자 우선순위와 방향을 고려해서 해석

 3. 강제 형 변환으로 포인터 변수에 주소를 직접 대입하지 않도록(고수 아니자너)