Back-End/C

C언어 Pointer(포인터) 개념 잡기

개발자 DalBy 2024. 5. 14. 14:58
반응형

변수와 포인터 차이

변수 : 특정 데이터 값을 가지고 있습니다.

포인터 : 특정 데이터가 저장된 기억 장소의 주소 값을 가지고 있습니다.

 

형식 : 자료형( * )

사용 예 : int *p;

기능 : 변수 p는 포인터 변수로서 정수형의 자료를 갖는 변수의 주소를 갖습니다.

 

int *p

p : 포인터 변수로서 정수 형 자료가 수록되어 있는 주소를 가지고 있습니다.

*p : 해당 주소에 수록되어 있는 정수 형 자료를 가지고 있습니다.

 

사용 예

int a, b;

int *p; // 변수 p를 포인터 변수로 선언

a=5000;

p=&a; // 포인터 변수 p에 변수 a의 주소 값을 대입

b=*p // 포인터 변수 p가 가리키는 주소의 내용을 변수 b에 저장

// 즉 a의 값 5000이 b에 저장된다.
// a=5000 b=*p
// p=&a = 5000
// b=5000

 

다른 예시

int *p, i=4
p=&i; // i의 주소 값 대입
*p=10; // i의 주소 값 10 대입

// i = 10

결과

결과 콘솔
결과 콘솔

 

포인터 연산

두 포인터 간에 덧셈 연산은 안 됩니다. 위치만 바뀌는 개념입니다.

int a[10], *p, *q;

p=&a[7]; // p = a[7]

q=p-3; // q = a[4]

p=p-5; // p = a[2]

포인터 배열 -> 포인터의 집합

포인터가 여러 개 사용될 때 포인터 배열로 선언

 

포인터 배열 예

포인터 배열
포인터 배열

포인터 cp에 배열 s의 내용을 참조합니다. 

*(cp + i) 출력 해 보면 1 ~ 7 까지 출력하는 것을 볼 수 있습니다.

 

포인터 배열의 예 2

포인터 배열2
포인터 배열 2

포인터 point는 [2] 배열 크기를 가지고 있습니다.

각각 [0] Array 배열과 [1] Array2 배열을 담습니다.

*(point[ i ] + j) 출력 해 보면 해당 값을 출력하는 것을 볼 수 있습니다.

*(point[0] + 1), *(point[0] + 2), ...

 

위 예시는 2차원 배열과 동일하며, 2차원 배열에 비해 기억공간 절약 효과가 있다고 한다.(진짜?)

(포인터 배열은 자료의 크기만큼 기억공간 할당)

 



반응형