포인터를 해보자 - 고등학생이 알려주는 C언어
C언어를 사용하는 이유 pointer(포인터)*
나, 오동현은 C언어의 포인터의 기본적이고 아주 기본적인 예제와 설명들을 이 문서에 기록해두었다.
먼저, 이렇게 C언어에서 이렇게 주소를 다룰 수 있을지 고민을 해보았는가?
int t=3;
int b;
&b = &t;
한번 우리 모두 실행을 해보고 아래의 글을 읽어보자!
기본적으로 C에서 포인터는 아래와 같다.
int *a;
이렇게 * 연산자만 사용해주면 포인터가 사용이 가능하다.
포인터 연산자를 사용하면 a라는 별칭의 변수에 어떠한 주소를 저장할 수 있다.
그러면 과연 a라는 별칭의 (주소를 저장하는)포인터 변수에 어떻게 b의 주소를 저장 할 수 있을까?
아래의 두가지 방법이 있다.
이 두가지 방법을 무조건 숙지해야한다.
그래야 포인터를 사용 할 수 있다.
int b;
int *a = &b;
,
int b;
int *a;
a = &b;
이렇게 위와 같이 a라는 별칭의 변수에 b의 주소값을 저장 할 수 있다.
그러면 int *a를 통해 선언 후, a에 저장된 b의 주소값을 출력하는 방법은 무엇일까?
만약 a에 &를 붙여준다고 생각했다면 엄청난 오해이다. (&a는 b의 주소를 저장하는 포인터 변수인 a 공간의 주소이다)
왜냐하면 우리는 *를 사용해 포인터 변수를 선언했기 때문에
a자체가 b의 주소값을 가진다.
int b = 3;
int *a = &b;
printf("%p", a); //a는 바로 a가 가지고 있는 주소값을 의미한다
그러면 이제 a가 가지고 있는 주소에 있는 값을 어떻게 출력할 수 있을까?
int b=3;
int *a = &b;
b=4
printf("%d", *a);
위와같이 다시 a에 *를 붙여주면 역참조(a가 가지고있는 주소의 값 가져오기)를 할 수 있는것이다.
출력은 "4"가 될 것이다.
정말 당신이 포인터 연산자 *하나를 쓰기 위해서 이 과정을 거쳐야할것으로 보인다...
앞으로 배열포인터 아니면 포인터함수, 이중 삼중 포인터를 써야할텐데.... ㅎㅎ
이걸 이해 한다면 이제 1차 포인터 수업을 끝내주도록하겠습니다.
int b = 3;
int *t = &b;
printf("%p ", t);
printf("%p ", &t);
printf("%d", *t);
int b=3;
int *t = &b;
printf("%p ", t);
printf("%p ", *(&t));
첫번째와 2번째의 출력은 &b의 값으로, 똑같다.
int b=3;
int *t = &b;
printf("%d ", *(*(&t)));
이 출력값은 3이 나오게된다.