포인터란 ?
- 사용 이유 : int array[size] 와 같이 크기를 내가 원하는 값으로 설정하기 위해
- 주소를 저장하는 일정한 크기의 메모리 공간 (주소는 시작 주소 값 자체)
- 포인터는 가리키는 변수의 형태가 같을 때만 대입해야 한다.
- 형 변환을 사용한 포인터의 대입이 가능하다.
동적 vs 정적
- 동적 : 메모리를 힙에서 할당 받으며, malloc 함수를 통해 크기를 동적으로 할당
- 장점: 유연성이 높다.
- 단점: 잘못 사용하였을 때 메모리 누수가 발생한다.
- 정적 : 메모리를 스택에서 할당 받으며 크기를 미리 정한다.
- 장점: 유연성이 없다.
- 단점: 간편하게 메모리를 할당 받을 수 있다.
주소 연산자 &
- 주소: 변수가 할당된 메모리 공간의 시작 주소
- 변수가 선언되면 각 자료형의 크기만큼 메모리에 저장 공간이 할당 된다.
- 주소 연산자 &를 사용하면 변수가 할당된 메모리 공간의 시작 주소 값을 알 수 있다.
간접 참조 연산자 *
- 포인터: 변수의 메모리 주소를 저장하는 변수
- 선언 시 : 자료형 * 변수명 (주소를 저장할 포인터도 변수처럼 선언해야 한다)
- 참조 시 : * 포인터 변수 (포인터를 가리키는 변수를 사용할 때는 * 로 간접참조)
- const: 포인터 변수가 가리키는 변수는 포인터 변수를 간접 참조하여 바꿀 수 없음.
배열과 포인터의 관계
배열은 자료형이 같은 변수를 메모리에 연속적으로 할당한다. 즉 각 배열 요소는 일정한 간격으로 주소를 갖게 된다.
배열의 주소 값은 배열의 첫 번째 주소 값이다.
ex) 첫 번 째 주소 값이 100일 때 int형 배열 요소의 주소 : 100 ,104, 108..
-> 첫 번째 요소의 주소만 알면 나머지 주소도 쉽게 알 수 있다.
1. 배열 명으로 배열 요소 사용하기
주소 + 정수 -> 주소 + (정수*주소를 구한 변수의 크기)
ex)변수가 int형 일 때 100+1=101 이 아니고 100 +1= (1*sizeof(int)) =104
ex 2) int arr[3]
arr[0] = *(arr+0)
arr[1] = *(arr+1)
arr[2] = *(arr+2)
ex) 배열 변수 arr
arr = &arr = &(arr+0)
ex) arr[0]= 1 , 포인터 변수 *p
p[0] = *(p+0) = *&p[0] = 1
2. 포인터 배열에서 NULL 값을 종료를 의미한다.
포인터 예시
1. 값을 변경해주기
swap(&a,&b); // a의 주소와 b의 주소를 대입
int swap(int *a,int *b){ // 주소를 저장할 공간은 포인터변수이므로 포인터 변수로 선언
// a= a의 주소값 *a= a의 값
int temp; // 임시 변수 temp
temp=*a; // 임시 변수 temp 안에 a의 값을 저장
*a=*b; // a 값에 b값을 대입
*b=temp; // b값을 temp에 대입
}
동적 메모리 할당 malloc 함수
프로그램 실행 도중 동적으로 메모리를 할당받는 것으로 필요한 만큼의 메모리만을 시스템으로 부터 할당을 받아 사용하고, 사용이 끝나면 시스템에 메모리를 반납한다. -> 메모리를 효율적으로 사용
c언어 에서는 동적메모리를 할당받기 위해 malloc 함수를 사용한다.
- 특징
- 필수 라이브러리 : #include <stdlib.h>
- malloc = 메모리를 할당하라는 의미, malloc의 기본 형은 void
- * 자료형 변수 = (자료형 *) malloc(sizeof(자료형));
- 동적 배열 = * 자료형 변수 = (자료형 *) malloc( 크기 * sizeof(자료형));
- 동적 메모리를 할당한 이후에는 메모리를 반환 free(변수형)
'C > 기본 문법 내용 정리' 카테고리의 다른 글
10장. 구조체 (0) | 2022.03.01 |
---|---|
9장. 문자열 (0) | 2022.02.08 |
7장. 배열 (0) | 2022.01.28 |
6장. 함수 (0) | 2022.01.28 |
5장. 반복문 (0) | 2022.01.26 |