Chapter 8

GraGrass·2024년 2월 8일

포인터

포인터 정의

1. 포인터 변수

선언 방식

char *p;
char*p;
char * p;
char* p;
  • 공백은 어디 있든 상관 X

곱셈 연산자와의 구분

  • 포인터의 *는 선언문에 사용됨
  • 자료형과 변수 이름 사이에 *이 오면 곱셈 연산자 X
  • char* p 선언 이후 -> p는 포인터(주소), *p는 char

포인터 매개 변수

const char* format = "Hello, World!\n";
  • string은 char의 배열
  • *format = 'H'
  • format[0] -> 'H' / format[13] -> '\n' / format[14] -> '\0' (null)
  • 포인터 변수는 배열처럼 사용 가능

2. 주소 연산자

변수의 주소를 나타내는 연산자: &

  • 비트 연산자 &(and)와 같은 형태
  • 단독으로 쓰이면 주소 연산자
  • C 함수 call by reference에 필수적임

배열 이름, 함수 이름은 이미 주소를 나타냄

int a[10]; // a -> &a
printf() // printf -> &printf

포인터 활용

1. 구조체 포인터

구조체는 일반적으로 call by reference 방식을 사용

struct mytime time{
	// initialize
};

time // -> call by value / time 구조체 전체를 복사
&time // -> call by reference / time 변수의 주소 전달
  • 주소 연산자를 명시적으로 사용해야 함

구조체의 포인터 멤버 접근

(*timeptr).tm_year
(*timeptr).tm_mon
(*timeptr).tm_mday

// 괄호를 피하기 위한 표현 문법
timeptr -> tm_year
timeptr -> tm_mon
timeptr -> tm_mday

구조체 복사를 피하기 위한 call by reference

(*timeptr).tm_year=0; // 오류
timeptr -> tm_year=0; // 여기도 오류!
  • 수정하기 위한 것이 아님을 명시적으로 나타내는 방법을 const 사용
  • 포인터 상수는 접근은 가능하지만 수정은 불가능

2. malloc 과 free 함수의 원형

원형: void* malloc(size_t size)

  • 헤더 파일은 <stdlib.h>이며, 메모리 할당에 사용됨
  • size_t는 정수형을 나타냄
  • return 자료형은 void* 포인터 (할당된 메모리의 시작 주소)

원형: void free(void* ptr)

  • return값이 없음

void* 포인터

int*p1 = malloc(4*3); // int p1[3];
int(*p2)[3] = malloc(4*2*3); // int p2[2][3];
int(*p3)[3][4] = malloc(4*2*3*4); // int p3[2][3][4];

free(p1);
free(p2);
free(p3);
  • 일반적인 포인터를 나타냄
  • 다차원 배열을 나타내려면 정확한 자료형 포인터를 지정해야 함
profile
올해는 진짜 갓생 산다

0개의 댓글