컴퓨터 사이언스

C언어 포인터

woohap 2024. 10. 2. 00:00

포인터

메모리 주소를 저장하기 위한 변수
포인터 변수를 이용하여 메모리에 직접 접근이 가능하다.
** 포인터 변수에는 메모리 시작 번지 주소가 저장됨
-> 포인터 타입만 알면 쉽게 추측 가능하기 때문

** 포인터 변수의 크기는 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