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 |