728x90

<포인터>

: 특정 위치를 가리키는 주소 정보

- 포인터 변수: 포인터(주소)를 저장하는 변수

cf) 포인터 변수의 크기(주소의 크기)는 일반적으로 전부 동일하게 4바이트

- 포인터 변수의 역할은 다른 변수를 가리키는 변수

- 포인터 변수의 데이터 타입은 포인팅하는 변수(보관하려는 변수)의 데이터 타입과 동일한 타입으로 선언

char*

int*

double* 

- 형식: 데이터타입 * 포인터변수명;

cf) 선언하면서 초기화도 가능 ex) int * pa = &a;

- sizeof() 연산자

ex) int sizeof(int) : 매개변수에 기술한 공간의 크기를 정수값으로 반환함

 

<포인터 초기화> 이부분만 정확히 알면 된다!!!

- &: 주소 구하기 연산자

ex) pa= &a;

- &데이터변수: 변수의 시작 주소를 의미

- *포인터변수: 포인터 변수가 가리키는 주소의 값, 내용

 

<포인터 이용>

- 주소 출력 형식지정자: %p 

- 이중 포인터(**): 포인터 변수의 주소를 저장하는 포인터 변수

 

<포인터 오류>

- 포인터도 변수이므로 사용 전 반드시 초기화해야함

cf) 초기화하지 않고 사용하면 실행 에러가 발생함 안하면 쓰레기 값을 가지고 있기 때문에

- 널 포인터: 포인터가 다른 벼수를 가리키지 않을 때는 NULL(0)로 초기화함

포인터를 안전하게 사용하려면 우선 포인터가 널 포인터인지를 검사

ex) if(p!=NULL)

*p=10;

- 포인터 변수의 데이터형이 반드시 포인터 변수가 가리키는 변수의 데이터형과 일치해야 함

 


<포인터와 배열>

- 배열명: 배열의 시작 주소를 의미하는 상수가 됨, 배열의 시작 주소를 구할 때는 & 없이 배열명만 사용

ex) int arr[5];

    arr == &arr[0]

- 배열의 시작 주소는 첫 번째 원소의 주소와 같음

- 배열명을 포인터처럼 사용 가능

- 인덱스를 사용하는 대신 배열의 시작 주소로 포인터 연산을 하면 배열의 특정 원소에 접근 가능

- 배열의 시작 주소로 초기화된 포인터를 이용해서 배열의 모든 원소에 접근 가능

- 포인터 변수를 배열 이름인 것처럼 사용 가능

- 포인터와 +, -  연산

ex)

a + N: a가 가리키는 데이터형 N개 크기만큼 증가된 주소가 연산의 결과 (값아니고)

a - N: a가 가리키는 데이터형 N개 크기만큼 감소된 주소가 연산의 결과

 

int 이면 4바이트 ex) 0x1000번지 → 0x1004번지

double 이면 8바이트 ex) 0x2000번지 → 0x2008번지

 

- 배열의 원소를 가리키는 포인터는 배열의 어떤 원소든지 가리킬 수 있음

 

<배열과 포인터의 차이점>


배열이 메모리에 할당되고 나면, 배열의 시작 주소 변경 불가

포인터 변수는 값을 변경할 수 있으므로, 포인터 변수에 보관된 주소는 변경 가능

베열명은 변수가 아니므로 증감 연산자에 의 한 연산은 불가능함

 

<포인터 증감 연산>

우선순위: a++ > ++a = * 후위연산자가 더 우선

ex) *a++ = *(a++)

++*a = ++(*a)

 

<포인터배열>

: 주소를 저장하는 배열

형식: 데이터타입*포인터변수명[크기];

 


<2차원 배열과 포인터>

배열 포인터: 이차원 배열의 전체를 가리키는 용도로 사용

형식: 데이터형 (*포인터명)[배열 크기];

728x90

'C언어' 카테고리의 다른 글

C언어 - 공용체와 열거체  (0) 2021.07.09
C언어 - 구조체  (0) 2021.07.09
C언어 - 문자열  (0) 2021.07.08
C언어 - 배열  (0) 2021.07.08
C언어 - 변수의 스코프  (0) 2021.07.08

+ Recent posts