C언어 복습 17 (배열과 포인터)
참고: 정덕 - <컴맹을 위한 C언어>
♨ 개인적 해석이 다분한 글임으로, 인지하지 못한 오류가 있을 수 있습니다 ♨
▣ '배열이름'이 '배열의 첫 요소 포인터'로써 인식될 수 없는 상황들
- 배열이름[인덱스] ≠ *(배열이름+인덱스) 인 경우
①배열이름이 주소연산자의 피연산자로 쓰인 경우
&배열이름
②sizeof연산자의 피연산자로 쓰였을 경우
sizeof(배열이름)
③char 배열을 초기화할때 문자열이 쓰였을 경우
char 배열이름[]="HelloWorld";
▣ 포인터 배열
- 배열인데 요소가 포인터
- 원시 자료형(int, float 등) 배열 선언
자료형 배열이름[개수]
예) int arr[10];
- 포인터배열 선언
포인터형 배열이름 [개수];
예) char* charArr[10];
▣ 함수 포인터
- 말 그대로 함수의 포인터(주소)
printf함수 자체를 인수로 참조 -> 함수의 시작주소 참조
- 함수의 시작주소란?
-> 프로그램 실행시키면 그 프로그램이 보조기억장치에서 주기억장치(메모리)로 복사
이때, ①코드 영역/ ②데이터 영역/ ③스택 영역으로 나위어 복사
①코드 영역: 프로그램에서 실행해야 될 명령어들이 들어가는 영역
②데이터 영역: 전역변수가 들어가는 영역과 힙 영역, 즉 데이터가 들어가는 영역
③스택 영역: 함수의 지역변수나 인자등이 들어가는 영역('함수의 영역'이 생성되고 소멸되는 영역)
함수의 지역변수는 스택영역에 저장, 함수의 내용은 코드영역에 있다
▣ 함수포인터
- 함수포인터 변수를 선언할 때 필요한 정보
① 함수포인터 변수 이름
② 인자형태
③ 반환값의 형태
③반환자료형①(*변수이름)②(인자자료형);
예) int (*fn) (int, int);
fn은 함수포인터 변수, fn에 담기는 함수가 파라미터(인자)를 int형 2개를 갖는다면
fn은 int 2개를 인자로 가져야 한다
예) 함수포인터 변수 사용예
- 일반 포인터의 경우 역참조연산자를 이용하면 포인터가 가리키는 데이터를 참조할 수 있다
그러나 함수포인터에는 역참조연산자를 사용할 필요가 없다 위의 예제와 같이 함수포인터 변수를 초기화했으면
원래 함수를 호출하듯이 사용 가능
▣ 포인터에 관한 주의사항
1. 포인터가 가리키는 것의 자료형을 엄격히 구분 -> 배열이라면 무엇이 몇개 들어있는지 까지
2. 연산자 우선순위와 방향을 고려해서 해석
3. 강제 형 변환으로 포인터 변수에 주소를 직접 대입하지 않도록(고수 아니자너)