[C] 포인터(2)
by 임우찬 2019. 9. 11. 11:18
6. * 연산자
* 연산자는 3가지 경우에 따라 *의 역할이 달라진다.
1. 변수명 * 변수명
2. 자료형 *변수명
3. * 변수명
1번의 경우는 다음과 같다.
ex)
이는 그냥 우리가 알던 것처럼 곱하기 연산자이다.
2번의 경우는 다음과 같다.
자료형 * 변수명의 형태는 포인터 변수 선언이다.
예시에서 본 것 처럼, * 연산자를 통해 int형의 b라는 포인터 변수를 선언했다.
생성한 포인터 변수 안에는 &a로, a의 주소값이 들어가있다.
포인터 변수는 이와 같이 주소값을 변수의 값으로 하는 변수이다.
int *b = &a;
와 같이 있다고 할 경우, 이는 *b라는 변수를 만드는 것이 아니라, b라는 int형 변수를 만드는데, 이 변수가 포인터변수라는 것을 알려주기 위해 *을 붙여준다고 생각하면 된다.
3번의 경우는 다음과 같다.
3번과 같은 경우인 *b만 있는 경우는 변수의 값을 참조하는 경우이다.
예시에서 보면, 우선 변수 a에 10이라는 값이 들어갔다.
이후 int형 포인터 변수 b가 생성이 되었고, 이 b의 값은 &a, 즉 a의 주소값이 되었다.
이후 c의 값으로 *b가 들어갔는데, * 변수명의 형태는 그 변수의 값을 참조하는 것이라 하였다.
따라서, b의 값을 참조하는 형태가 되는데, b의 값은 현재 &a이다.
그래서 풀어보면
int c = *&a; 와 같은 형태가 된다.
&a의 값을 참조하므로, a의 값이 c 안으로 들어가게 된다.
따라서, c = 10과 같은 형태가 되는 것이다.
또한, *과&가 같이 붙어있는 경우는 *과 &가 상쇄된다고 하는데,
예시로 int c = *&a; 와 int c = a;가 같은 것을 말한다고 생각하면 된다..
7. 포인터변수 사용
ex1)
이와 같은 코드가 있을 때, 함수를 거쳐 나왔음에도, a의 값은 10이 출력되었다.
왜 그런 것일까?
우선 첫 사진에서, 코드 순서대로 main함수의 변수 a가 선언되었고,
함수 호출 시 매개변수 p가 선언되었는데, 함수 인자값으로 a가 들어갔기에, p는 10의 값을 가지게 되었다.
두 번째 사진을 보면, hello함수 내에서 p의 값을 100으로 바꾸었기에, 값이 p는 100으로 바뀌었다.
세 번째 사진에서 p는 매개변수이므로, hello함수가 끝나는 대로 사라지게 된다.
이후 a를 출력하였으므로 10이 출력된다.
그럼 이렇게 함수를 통해서 메인함수의 값까지 바꾸고 싶다면 어떻게 해야할까?
ex2)
이 코드는 함수를 거쳐 나온 뒤 a의 값이 100으로 바뀌었다.
1번 그림을 보면 코드 순서대로 main함수의 변수 a 가 선언되고, hello함수의 매개변수인 포인터변수 p가 선언되었다. a의 값은 10이고, hello함수의 인자값으로 a의 a의 주소값이 들어갔다.
두 번째 사진을 보면, hello 함수 안에서 *p의 값을 100으로 바꾸었으므로, *&a의 값을 100으로 바꾼 것이다.
이후, p는 매개변수이므로, hello 함수가 종료되면서 사라진다.
이렇게 주소를 이용하여 값을 바꿀 수 있다.
[C] 동적 메모리 할당
2019.09.11
[C] 포인터(1)
* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.
댓글 영역