210917, C언어 입문 - day 9-2

Min Hyeok·2021년 9월 17일
0

C언어 개념 익히기

목록 보기
10/19

ㅋㅋ

ㅋㅋ;;

죄송합니다.
수요일에 공부 넘 하기 싫어서 집정리했고 (놀진 않음!!!!!!!!!!!) 목요일은 복습 적기 귀찮아서 ㅎㅎ;; 양심의 가책을 느끼고 오늘 왔다.

포인터 끝내보자.

13장, 포인터 2부

포인터를 쓸 때, 앞에 를 붙여줘야 한다는 것을 앞에서 인지했다. 뭐 ptr 이렇게. 그런데 프로그램을 짜다가 실수를 할 수 있지 않은가? 만약 *를 안 붙인다면 귀찮아지는 경우가 발생할 수도 있다. 이를 대비하기 위해,

const라는 키워드가 있다.

우리가 프로그램을 쓸 때, 포인터를 쓰면서 주소를 변경하는 경우가 거의 없을 수도 있다.

예로들면,

void Swap(int * const pa, int * const pb) {
	int temp = *pa;
    *pa = *pb; /** 이 부분을 A라고 가정**/
    *pb = temp; 
} /** a와 b를 입력 받았을 때, a의 값과 b의 값을 서로 바꿔주는 함수**/

이런 식으로. pa와 pb에 어떤 값을 main함수에서 받아오면, 얘들에 저장된 주소를 바꿔줄 필요가 없잖아? 프로그램을 짤 때? 그런데 실수로 *를 안넣거나 하면 의도치 않게 주소를 바꿔버리거나 의도치 않은 일이 발생할 수도 있단 말이지. 그런 경우를 대비해서 const 키워드를 쓰는거다.

위처럼 const를 넣어주면 만약 A에서 pa = pb로 잘못 입력했을 때, const키워드 때문에 오류가 발생한다. const 변수로 지정된 bro는 값을 변경할수 없기 때문에.

이 const도 사용법이 여러가지인데,

  1. int * const p; : p가 가지고 있는 주소 변경 불가능
  2. const int p; : p = 3; 처럼 대상 값 변경 불가능
  3. const int * const p; : 1, 2 둘 다 불가능.

이렇게 쓸 수 있다.

그리고 전에 언급했던 것 같은데, 내가 안 까먹으려고 다시 적어놓자면. 만약 포인터 변수 ptr을

int data = 3;
int *ptr = &data;

라고 set했을 때, *ptr의 앞에 정해준 int 자료형은 "포인터 변수의 크기가 int"가 아니고, "포인터 변수가 가리키는 대상 data의 크기가 int"를 말하는 것이다. 꼮꼮ㄲㄲ꼮ㄲ 기억해두자.

그리고 +a로, 포인터가 가리킬 수 있는 크기와, 실제 대상 크기가 다른 경우가 있다.

int data = 0;
short *p = (short *)%data;

이렇게. 이런 포인터의 특성을 잘 활용해 준다면, 4바이트 크기 변수에 저장된 임의의 값을 1바이트 단위로 출력할 수도 있다. 물론 수정할 수도 있고.

int i, data[2] = {0x12345678, 0x12345678};
char *ptr = (char *)data;   /** data는 &data[0]과 같은 표현. 15장에서 설명함 **/
for (i=0 ; i<4 ; i++) {
    printf("%x, ", *(ptr + i)); /** 78, 56, 34, 21, 이라고 출력 **/
}
*(char *) (data) = 0x66;   /** data[0]의 값이 0x12345666 으로 바뀐다 **/

이렇게, 출력도, 수정도 가능하다.

그리고 지금까지 int 포인터형이나 char 포인터형을 봐왔는데, void *형이란 것도 있다.

보통 우린 대상의 크기를 모르면 "정해져 있지 않다"는 뜻의 void를 사용해왔다. 이를 포인터에 써먹는다면?

void *p;

포인터 변수 p에 "주소를 저장할 수"는 있지만, 그 주소에서 값을 읽거나 저장할 때 "크기는 모른다". 포인터를 쓸 때 사용할 메모리의 시작 주소는 알지만, 얼마나 쓰는지 or 끝 주소를 모를 때 쓴다.

형 변환을 활용해서 써먹으면 됨.

int data = 3;
void *ptr = &data;
*(int *)ptr = 2;

요렇게.

뭐 포인터 나머지 부분은 기본적인 개념, 이론보단 좀 실제 활용하는데에 관련된 내용인 것 같아서 복습이 오래 걸리진 않은듯. 다음에 직접 활용할 때에 그 때 그 때 찾아보며 내용을 머리에 남기자.

요까지.

0개의 댓글