2019.07.03
갤러들이 포인터에서 포기할거라고 하길래 긴장빨고 함
포인터란 메모리의 주소 값을 저장하기 위한 변수라고 함
포인터는 다른 변수의 주소를 값으로 지니고
타입에 상관없이(char든 int든 double이든) 그 크기가 4바이트라고 함
포인터 변수 pA가 a를 가리키는 예제
포인터를 선언할 때에는*연산자를 사용한다고 함
int *a는 int형 변수의 주소 값을 지닐 수 있는 int형 포인터
char *b는 char형 변수의 주소 값을 지닐 수 있는 char형 포인터
double *c는 double형 변수의 주소 값을 지닐 수 있는 double형 포인터
주소 값을 참조할 때&연산자를 사용한다고 한다 (&a는 변수 a의 주소 값을 반환하라는 의미)
포인터가 가리키는 메모리를 참조하기 위해선*연산자를 사용한다고 함
a라는 변수를 통한 접근과 같은 방식은 직접 접근(Direct Access)
pA라는 포인터 변수를 통한 접근과 같은 방식은 간접 접근(Indirect Access)
*연산자보다 ++연산자의 우선 순위가 높기 때문에*변수를 괄호로 감싸야만 함
pA는 a의 주소값을 갖고 있으므로
포인터 pA가 지니는 주소 값과 변수 a의 주소 값과 동일함
*가 붙으면 그 주소 안에 들어있는 값을 참조하라는 의미이므로 2006이 출력된다
다음과 같이 일반 변수와 포인터 변수를 동시에 선언하는 것도 가능하다고 함
int a,*pA;
그러나 헷갈릴 수 있으므로 두 줄로 나눠서 쓰라고 한다
포인터에 타입을 나눈 이유는 읽어들일 바이트의 수를 알기 위해서임
int 포인터면 4바이트를 읽고, double 포인터면 8바이트를 읽는 것이 그 예
연습문제1인데 혹시 틀린거 있으면 알려주셈
1. p1에 n의 주소값이 들어감
2. p2에 p1가 가리키는 변수의 주소값, 즉 n의 주소값이 들어감 (*p2 =&p1으로 하니*p2 값이 이상해지더라)
3. p1이 가리키는 변수, 즉 n에 10이 들어가있으므로 10출력하고 +1
4. p2가 가리키는 변수, 즉 n에 11이 들어가있으므로 11출력하고 +1
5. n 은 현재 12이므로 n을 출력하면 12
연습문제2 char형 변수 a, int형 변수 b, float형 변수 c, double형 변수 d를 선언하고
각각을 가리키는 포인터 p1,p2,p3,p4를 선언한 후 간접 접근으로 +1시키래서 짠 코드
연습문제3 간접 접근 방식으로 a, b를 1 감소시키고
포인터 p1와 p2가 가리키는 대상을 서로 바꿔주라고 해서 풀어본 코드
포인터는 메모리의 주소 값을 나타내므로 사용할 때 상당한 주의가 필요
포인터를 선언할 경우 변수의 주소값으로 초기화하는 것이 필수
다음 챕터에선 포인터와 배열의 관계에 대해 나옴
배열의 이름도 포인터이며
단 그 값을 바꿀 수 없는 상수라는 점이 일반적인 포인터와의 유일한 차이점이라고 함
배열 요소의 각 사이즈가 4바이트를 차지하고 있으며
배열 이름은 첫 번째 요소의 주소 값을 나타냄
포인터와 배열 이름은 공통적으로 이름이 있고, 메모리의 주소를 나타내지만
포인터는 변수이고, 배열 이름은 상수라는 것이 차이점
포인터를 배열의 이름처럼 사용할 수 있다고 함
배열의 이름은 첫 번째 요소의 주소를 가리키는 포인터이므로
ptr = arr같은 표현이 가능
머리 아파서 여기까지 하고 책 바로 덮음
알고나면 별것도 아님. 주소, 주소안의 값, 값있는 곳의 주소 그냥 이런거 구분하면 되는거임.
소스보면 대충 이해되긴 하는데 언제 &붙이고 *붙이고 아예 안붙이는건지 혼란오는중...
짝짝짝
포인터랑 주소라는 개념이 생소해서 그런거지 절대어려운것도 아니고 상당히 직관적인 개념임