포인터
메모리 주소를 저장하기 위한 변수
포인터 변수를 이용하여 메모리에 직접 접근이 가능하다.
** 포인터 변수에는 메모리 시작 번지 주소가 저장됨
-> 포인터 타입만 알면 쉽게 추측 가능하기 때문
** 포인터 변수의 크기는 64비트 시스템에선 8byte, 32비트 시스템에선 4byte
** 포인터를 초기화하지 않고 값을 대입해서는 안 됨
-> 아무 메모리 공간에 접근할 경우 문제 발생 가능
** 포인터에 0을 대입하는 것은 널 포인터를 의미한다.
포인터 변수 선언
// 타입 * 변수명;
int * pnum;
포인터 연산자 ‘&’와 ‘*’
피연산자의 주소 값을 반환하는 &연산자
& 연산자의 피연산자는 변수여야 함
포인터가 가리키는 메모리를 참조하는 *연산자
pnum은 포인터 변수를 의미
*pnum은 포인터 변수가 가리키는 변수를 의미
int num = 100;
int * pnum = #
// num 주소에 200을 저장
*pnum = 200;
포인터와 배열의 관계
포인터는 변수형 포인터와 상수형 포인터 존재
지금까지 배운 포인터는 변수형 포인터
**** 배열이름은 상수형 포인터, 즉 주소 값을 변경할 수 없는 포인터를 의미한다.
즉, 배열이름을 이용해서 포인터처럼 사용가능
arr[i] == *(arr + i)
포인터 연산
포인터를 대상으로한 증감 및 감소 연산 가능
-> 포인터를 대상으로 n 증가시면 n * sizeof(타입)의 크기만큼 증가한다.
** 증감식을 사용할 경우 실제 포인터 변수의 주소가 변경됨
int * pnum = # // pnum의 주소가 0000
++pnum; // pnum의 주소가 0004가 됨
포인터와 함수
call by value
함수의 매개변수에 단순히 값을 복사하는 형태
-> 매개변수 또한 지역변수이므로 함수가 종료되면 메모리에서 제거됨
즉, 아무리 매개변수를 변경해도 외부 변수의 값이 변경되지 않음
call by reference
함수의 매개변수가 외부 변수의 주소를 참조하는 형태
-> 매개변수가 직접 외부 변수의 주소를 참조하므로 매개변수의 값을 변경하는 경우 외부 변수의 값이 변경됨
다중 포인터
단일 포인터의 주소를 저장하는 변수
**
이중 포인터
함수 내에서 단일 포인터 변수에 직접 접근하여 저장된 주소를 변경하고자 할 때 사용
**
삼중 포인터
함수 내에서 이중 포인터 변수에 직접 접근하여 저장된 단일 포인터의 주소를 변경하기 위해 사용
다차원 배열의 포인터
// int arr2[3][5]의 포인터는 다음과 같이 선언
int *(parr)[5]
해당 포인터에 대한 + 1 포인터 연산을 수행할 경우
sizeof(int) * 5 크기 만큼 메모리 주소가 증가한다. 즉, 다음 행의 시작 주소로 이동한다.
parr + 1 == &arr2[1]
**
포인터 배열과 배열 포인터는 다른 것
포인터 배열 - char * str[30]
배열 포인터 - int *(parr)[5]
함수 포인터
함수이름도 배열이름처럼 상수형 포인터이다.
***
함수는 바이너리 형태로 메모리 공간에 저장됨
함수 포인터 선언
// 반환타입 (*포인터이름) (매개변수타입)
int (*pfunc)(int, int) = add;
// add(10,20)과 동일한 결과를 반환
pfunc(10,20);
// add 함수 구조
int add(int a, int b) {
return a + b;
}
'컴퓨터 사이언스' 카테고리의 다른 글
1의 보수, 2의 보수 (0) | 2024.10.04 |
---|---|
JPG, PNG, GIF 차이점 (1) | 2024.10.03 |
실수 표현법(부동 소수점, 고정 소수점) (0) | 2024.10.01 |
Call By Value, Call By Reference Python (0) | 2024.09.30 |
32비트와 64비트 차이 (0) | 2024.09.29 |