본문으로 바로가기

[네퓨즈 수업 - C] 포인터 정리

category 네퓨즈 수업 2016. 4. 12. 17:34

포인터란

- 모든 변수는 메모리의 특정 위치에 저장됨

- 그 위치에 대한 메모리 주소를 포인터라고 함

- 포인터 변수 = 값이 아니라 위치를 저장함

- 변수가 집이라면 포인터는 주소

 

포인터 선언

- 자료형 *ptr;

(* 참조연산자 : 어떤 포인터변수에 저장된 "주소에 액세스" => 값 반환)

 

포인터 사용

int a=10;

ptr = &a;

(& 주소연산자 : 어떤 변수의 "주소" 변환)

 

포인터 특징

int *p; <포인터 변수는 무조건 4바이트이다>

포인터는 윈도우의 바로가기와 비슷한 개념이라고 생각하면 쉽다.

포인터는 무조건 어딘가를 가리켜야 쓸수있다.(예외가 존재하긴함)

 

포인터의 초기화

int *ptr = 10; ( X ) > int *ptr은 주소를 저장할 공간을 만들라는 뜻이다. 10은 주소값이 없다.

int *ptr = (int*)malloc(4) ( O ) > (malloc의 반환형식은 void이므로 int로바꾼다. 그리고 4는 int가 4바이트라 써준다)

원래는 변수를선언하면 어느메모리에 저장할지 자동으로 정해주는데 포인터는 가르키기만 하는것이므로 malloc으로 직접 정해준다.

 

포인터와 배열

포인터와 배열은 매우비슷하다. 배열은 상수형 포인터, 다시말해 고정된 포인터 변수라고 할 수 있다.

배열은 여러개의칸이다? ( X ) 배열은 포인터다 ( O )

char *ptr;

char str[15];

ptr = str; // str은 배열의 첫번째 주소값을 나타낸다.

str[0] == ptr  // 참

str[1] == *(ptr+1) // 참

&str[2] == ptr+2 // 참

str[3] == ptr[3]  // 참

 

 

char 형은 1 byte 이므로 ptr+1씩 더해진다.

int 형은 4 byte 이므로 ptr+4를 해야 다음값으로 넘어갈 수 있다.

 

포인터 응용

포인터 배열 = 포인터 + 배열

int arr[3][4] = { {2, 3, 4} , {5,6,7,8} , {9,10} };

원래 배열에서는 이렇게해서 각각 값을 넣어줄 수 있다.

int *ptr[3] = { {2, 3, 4} , {5,6,7,8} , {9,10} };

하지만 ptr은 무엇인가를 가리킨다. 그러므로 ptr[0]은 2, 3, 4의 시작점 주소 연결해준다. ptr[0]을 출력하면 2 3 4 가 나온다.

 

더블 포인터 = 포인터의 포인터

int a;

int *ptr = &a;

int **ptrptr = &ptr;

ptr의 주소값을 ptrptr이 가지고있다는 가정하에 ptr의 주소값을 ptr

 

구조체 포인터 = 구조체 + 포인터

구조체에 접근하려면 .을 쓰지만 포인터 구조체는 ->를 쓴다.

(*ptrData).num

ptrData -> num

 

call by value & call by reference

call by value : 값만가지고 함수를 부른다.

함수에서 return을 안해주면 값이 전부 없어진다. 함수를 그냥 부르면 [ ex) swap(10,20); ] 전달할때 값을 복사해서 전달한다. 그래서 void를 선언해서 함수내에서 매개변수를가지고 계산을해도 main에서 값은 바뀌지않는다.

call by reference : 주소로 함수를 부른다.

swap(&a,&b)로 직접 주소를 가지고 불러서 포인터를가지고 함수내에서 연산하면 main 함수에서 그 변수를 사용했을떄 값이 바뀐다.