우당탕탕 개발일지

포인터(Pointer)의 선언, 접근, NULL포인터 본문

C언어

포인터(Pointer)의 선언, 접근, NULL포인터

정옴 2023. 5. 6. 11:58

포인터?

모든 변수는 메모리에 위치한다.

이때, 메모리의 위치를 메모리주소(address)라고 한다.

이러한 메모리 주소를 담을 수 있는 변수포인터라고 함

포인터의 개념 이미지

i = 3;
int* j = &i;    // 65524

-> *는 포인터, &는 주소를 의미한다.

 

포인터 선언

int a = 1;
float b = 2.0f;

int* x;     // int형 변수의 주소를 담을수 있는 변수(포인터)
x = &a;     // &는 해당위치의 주소를 가져오는 연산자임

float* y;   // float형 변수의 주소를 담을수 있는 변수(포인터)
y = &b;

struct person { ... } c;
struct person* w = &c;   // struct person형 변수의 주소를 담는 변수(포인터)

void* z;    // 모호한 타입의 주소를 담는 변수
z = x;
z = y;
z = w;

 

포인터 접근

int a = 1;
int* x = &a;   // &a : a의 주소를 가져오기

int b = *x;    // x포인터가 가르키는 주소에 들어있는 값을 b에 할당 -> 1

x              // 포인터가 가르키는 주소값 -> a의 주소
*x             // 포인터가 가르키는 주소의 메모리에 들어있는 값 -> a의 값 -> 1
*x = 10;       // 포인터가 가르키는 주소의 메모리에 10으로 할당 -> a = 10

struct person { 
  char gender;
  int  age;
};
struct person man;
man.gender = 'M';
man.age = 21;

struct person* pman = &man;
pman->age = ...;   // 포인터가 가르키는 struct의 멤버 접근

void* y = &a;

*y = 10;          // y가 가르키는 타입이 무엇인지 y는 몰라서 오류 발생함
                  // error: incomplete type 'void' is not assignable

*(int*)y = 10;    // y가 가르키는 주소가 int값을 담고 있는 메모리라고 알려줌. 에러 안남

 

NULL 포인터

int* ptr = NULL;       // ptr은 NULL 아무 주소도 할당되어 있지 않다
                       // NULL = 0

if (ptr) { ... }       // ptr에 주소값이 NULL이 아닌값이 할당된 경우
if (!ptr) { ... }      // ptr에 NULL로 할당되어 있는 경우

'C언어' 카테고리의 다른 글

동적 메모리 할당(malloc, calloc, realloc, free)  (0) 2023.05.07
Comments