$bash

C - 포인터

0x0300 : Study/0x0304 : Programming

포인터

변수의 메모리 주소 저장하는 변수

// 변수?

/ 메모리 상의 저장공간

/ 그 위치를 알면 사용할 수 있음


//위치값 - 주소


포인터와 연산자

주소 연산자 - int a;

     &a;

포인터 - char *pc;

              int *pi;

      double *pd;

간접 참조 연산자 - *pi = 10;


주소연산자

프로그램이 사용하는 메모리에는 바이트 별로 주소값 존재

// 0부터 시작하고 바이트 단위로 1씩 증가

// 2바이트 이상의 크기를 갖는 변수는 여러 개의 주소값에 걸쳐 할당


이러한 코딩으로 변수의 메모리 주소를 확인 할 수 있다.


포인터와 간접참조 연산자

예시로 포인터에 대해 설명해보자.


포인터는 '*' 를 앞에 붙이며 저것은 포인터를 의미하는 표기이다.


int *pa;

int는 주소를 구한 변수의 형태를 의미하며 *는 포인터의 기호, pa 는 포인터의 이름이다.


간접참조 연산자를 사용한 예시로.

대입 연산자 왼쪽 

변수 a사용 // a = 10; 

포인터 pa 사용 // *pa = 10;

대입 연산자 오른쪽

변수 a사용 // b = a;

포인터 pa 사용 // b = *pa;

피연산자

변수 a사용 // a + 20;

포인터 pa 사용 // *pa + 20;

출력

변수 a사용 // printf("&d", a);

포인터 pa 사용 // printf("%d", *pa);

입력

변수 a사용 // scanf("%d", a);

포인터 pa 사용 // scanf("%d", &*pa);

 // scanf("%d", pa);


여러 가지 포인터

// 다양한 포인터의 사용법


포인터를 사용한 두 정수의 합과 평균 계산을 하는 코딩이다.

위처럼 가리키는 변수의 형이 같은 경우 포인터 연속 선언이 가능하다.

포인터의 선언과 동시에 초기화 하는 것 또한 가능한 것을 확인 할 수 있다.


const를 사용한 포인터

// 포인터에 const함수를 사용해보자.


포인터에 const 함수를 사용하여 만든 코딩의 예시이다.


const가 일반 변수 처럼 포인터 값을 고정시킨다면 9행에서 pa는 다른 변수의 주소를 저장 할 수 없다.

pa는 const의 사용과는 무관하게 변수 b 주소 저장, 그 값 간접 참조하여 출력한다.

// 에러 발생 :: l-value 가 const 개체를 지정합니다.


포인터와 주소의 차이

주소는 변수에 할당된 메모리 저장 공간 시작 주소값 자체이다.


포인터는 그 값 저장하는 또 다른 메모리 공간

// 특정 변수의 주소값은 바뀌지 않음

// 포인터는 다른 주소 대입하여 그 값을 바꿀 수 있음


예시로

int a, b;    // 일반 변수 선언

int *p;      // 포인터 선언

p = &a;    // p가 a를 가리키도록 설정

p = &b;    // p가 변수 b를 가리키도록 바꿈


이러한 예시 뿐만 아니라 두 포인터를 한 주소로 저장 할 수 있다.

int a;

int *pa, *pb;

pa = pb = &a;


// 자세한 설명은 생략한다.


주소와 포인터의 크기

모든 주소와 포인터는 같은 크기

// 저장할 주소의 크기에 따라 결정

// 크기가 클수록 더 넓은 범위의 메모리 사용 가능

// 포인터의 크기는 컴파일러에 따라 다를 수 있음


sizeof 연산자를 가지고 주소와 포인터의 크기를 출력하는 코딩이다.

3가지의 변수의 주소 크기는 4로 일정하며, 포인터의 크기 또한 4 로 일정하다.

하지만 각각의 포인터가 가리키는 변수의 크기는 char가 1,  int가 4, double이 8로 나타난다.


포인터의 대입 규칙

크기가 모두 같으므로 대입 연산 쉽게 생각 할 수 있다.

// 포인터는 가리키는 변수의 형태가 같을 때만 대입

// 포인터끼리 대입 연산 수행

/ 여러 개의 포인터로 같은 데이터 다루는 것이 가능

위의 코딩은 허용되지 않은 포인터의 대입이다.


포인터가 필요한 EU

변수 사용하는 가장 쉬운 방법은 이름을 쓰는 것

// 포인터를 사용하려면 추가적인 변수 선언 필요

// 각종 연산 수행해야 하므로 필요한 곳에만 사용


포인터를 사용한 두 변수의 값 교환이다.

swap이라는 이름으로 매개변수로 포인터를 선언하여 두 변수의 값을 바꿨다.


포인터 없이 두 변수의 값 바꾸기

swap 함수에서 main함수의 a,b를 이름으로 직접 사용하는 방법


이 과정에서 a, b를 이름으로 직접 사용하는 방법을 사용했기 때문에 선언되지 않는 식별자로 에러가 뜬다.


// 그래도 기본적인 배열에서 교환하는 것 이랑 비슷비슷해서 .. 자세한건 생략!


'0x0300 : Study > 0x0304 : Programming' 카테고리의 다른 글

Cpp 기초 (A+B 응용화)  (0) 2017.05.24
NASM - LD 컴파일 후 실행  (0) 2017.05.13
C - 배열과 포인터  (0) 2016.06.14
C - 배열  (0) 2016.06.13
C - 함수  (0) 2016.06.13