Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

Hello Security World

C언어 [C언어 주소와 & 포인터] 본문

프로그래밍/C

C언어 [C언어 주소와 & 포인터]

프로앱등이 2020. 5. 3. 19:33

포인터의 개념

C언어에서 포인터는 상당히 중요한 부분이다. 변수 또는 배열을 선언하였을 경우 값이 저장되는 주소

를 활용하는 방법을 '포인터' 라고 하며, 이 때 특정 주소에 저장되어 있는 값을 나타내도록 하는 변수를

'포인터 변수' 라고 한다. 포인터 변수는 일반 변수 'po' 와 다르게 변수의 앞에 '*'를 붙혀 '*po'라고 한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
 
void main()
{
    int num = 10;
    int * ptr;
    
    ptr = &num;
    printf("포인터 ptr이 가리키는 값 : %d \n"*ptr);
    printf("num에 저장된 값 : %d \n\n",num);
    
    *ptr = 20;
    printf("포인터 ptr이 가리키는 값 : %d \n"*ptr);
    printf("num에 저장된 값 : %d \n\n",num);
    
    (*ptr)++;
    printf("포인터 ptr이 가리키는 값 : %d \n"*ptr);
    printf("num에 저장된 값 : %d \n\n",num);
    
}
 
결과값 :
포인터 ptr이 가리키는 값 : 10
num에 저장된 값 : 10
 
포인터 ptr이 가리키는 값 : 20
num에 저장된 값 : 20
 
포인터 ptr이 가리키는 값 : 21
num에 저장된 값 : 21
 

 

위와 같이 실행 결과 를 통해 알 수 있다. 즉 포인터 변수는 어떠한 변수의 주소를 담기위한 변수이다.

그릇을 예로 들자면 변수와 변수는 타입이 같을경우 서로 같은그릇에 담을수 있다 하지만 '변수의 주소' 를 담기위해서는

변수를 담는 그릇인 '포인터 변수' 를 선언 하고 '포인터 변수' 에 값을 대입 해야한다.

int a = 40;

int* p;

p = &a;

이런식으로 말이다. &앰퍼샌드 연산자는 주소를 의미한다. 따라서 '포인터 변수'에 주소를 담기 위해선 &앰퍼샌드 연산자를 활용하여

'포인터 변수' *p 에 담는것이다.

예제) SWAP a,b의 변수의 값을 swap함수에서 바꿔라.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
void swap(int*a_a,int*b_a){
    int temp = *b_a;
    *b_a=*a_a;
    *a_a=temp;    
}
 
void main(){
    int a=10, b=20;
    swap(&a, &b);
    printf("%d %d",a,b);    
}
결과 값 : 20 10
 

포인터를 설명할때 가장 많이 쓰이는 예라고 할수 있다 함수의 Call By Reference와 같은 원리이다.

스텍 프레임안의 함수영역에 접근 할 수 있는 방법은 오로지 '주소' 밖에 없다.

따라서 위의 코드는 변수 a와 변수 b의 &주소 를 보냄으로서 swap 함수가 main함수의 a,b 변수에 접근이 가능하게 되고

'*포인터' 를 이용하여 해당 주소에 담긴 값(value) 에 접근 할 수 있는것이다.

포인터 변수와 주소를 사용하지 않았다면 위의 SWAP은 실패하였을 것이다. 함수의 스쿠퍼 영역때문에 swap함수가 main함수에

접근하지 못하는것이다.