상세 컨텐츠

본문 제목

[C] 포인터(2)

개발공부/C

by 임우찬 2019. 9. 11. 11:18

본문

 

6. * 연산자

* 연산자는 3가지 경우에 따라 *의 역할이 달라진다.

1. 변수명 * 변수명

2. 자료형 *변수명

3. * 변수명

1번의 경우는 다음과 같다.

ex)

int a = 1;
int b = 2;
int c = a * b;

이는 그냥 우리가 알던 것처럼 곱하기 연산자이다.

2번의 경우는 다음과 같다.

ex)

int a = 1;
int *b = &a;

자료형 * 변수명의 형태는 포인터 변수 선언이다.

예시에서 본 것 처럼, * 연산자를 통해 int형의 b라는 포인터 변수를 선언했다.

생성한 포인터 변수 안에는 &a로, a의 주소값이 들어가있다.

포인터 변수는 이와 같이 주소값을 변수의 값으로 하는 변수이다.

int *b = &a;

와 같이 있다고 할 경우, 이는 *b라는 변수를 만드는 것이 아니라, b라는 int형 변수를 만드는데, 이 변수가 포인터변수라는 것을 알려주기 위해 *을 붙여준다고 생각하면 된다.

3번의 경우는 다음과 같다.

ex)

int a = 10;
int *b = &a;
int c = *b;
printf("%d",c); //10

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)

#include<stdio.h>
void hello(int p){
p = 100
}
main(){
int a = 10;
hello(a);
printf("%d",a); // 10
}

이와 같은 코드가 있을 때, 함수를 거쳐 나왔음에도, a의 값은 10이 출력되었다.

왜 그런 것일까?

우선 첫 사진에서, 코드 순서대로 main함수의 변수 a가 선언되었고,

함수 호출 시 매개변수 p가 선언되었는데, 함수 인자값으로 a가 들어갔기에, p는 10의 값을 가지게 되었다.

두 번째 사진을 보면, hello함수 내에서 p의 값을 100으로 바꾸었기에, 값이 p는 100으로 바뀌었다.

세 번째 사진에서 p는 매개변수이므로, hello함수가 끝나는 대로 사라지게 된다.

이후 a를 출력하였으므로 10이 출력된다.

그럼 이렇게 함수를 통해서 메인함수의 값까지 바꾸고 싶다면 어떻게 해야할까?

ex2)

#include<stdio.h>
void hello(int *p){
*p = 100
}
main(){
int a = 10;
hello(&a);
printf("%d",a); // 100
}

이 코드는 함수를 거쳐 나온 뒤 a의 값이 100으로 바뀌었다.

1번 그림을 보면 코드 순서대로 main함수의 변수 a 가 선언되고, hello함수의 매개변수인 포인터변수 p가 선언되었다. a의 값은 10이고, hello함수의 인자값으로 a의 a의 주소값이 들어갔다.

두 번째 사진을 보면, hello 함수 안에서 *p의 값을 100으로 바꾸었으므로, *&a의 값을 100으로 바꾼 것이다.

이후, p는 매개변수이므로, hello 함수가 종료되면서 사라진다.

이렇게 주소를 이용하여 값을 바꿀 수 있다.

'개발공부 > C' 카테고리의 다른 글

[C] 동적 메모리 할당  (0) 2019.09.11
[C] 포인터(1)  (0) 2019.09.11

관련글 더보기

댓글 영역