C언어 공부

C언어 심화 - 포인터 4

당혜성 2025. 3. 14. 21:29

0 - value, nullptr

포인터는 nullptr 이라는 값으로 0 - value 가 지정이 가능하다

 

0 - value란?

각각의 변수가 가질 수 있는 무(zero) 값을 의미한다

 

0 - value 에는 널문자, 0, false, nullptr 등이 있다

 

배열 초기화

배열의 모든 값은 0 - value로 초기화를 하기 위해서는 다음의  표현이 가능하다

Type v [10] = {0,};

혹은 포인터 타입의 배열일 경우
Type* v[10] = {nullptr,};

코드 예시

#include "Header.h"

struct marine {
	int hp = 40;
	int mp = 20;
};

int main() {
	marine* marine[40] = { nullptr, };

	printf("%d", marine[0]);

	return 0;
}

단순하게 배열에 {nullptr,} 을 넣으면 된다

 

포인터의 포인터

이중포인터에서 기본형 데이터 타입일 경우

->2차원 배열일 가능성이 높음

int** v; // int의 2차원 동적배열일 가능성이 높음

 

구조체 타입일 경우

->포인터 배열일 가능성이 높음

Type** v; // Type*의 1차원 동적배열일 가능성이 높음

 

예시 코드

#include "Header.h"

struct marine {
	int hp = 40;
	int mp = 20;
};

int main() {


	marine** m;
	m = (marine**)malloc(sizeof(marine*) * 20);

	return 0;
}

 

이게 무슨 뜻이냐 하면,  marine * m[20]과 똗같다고 보면 된다.

 

간단하게 설명하자면

Marine* marine[20] <-이렇게 할걸
marine** m; <- 이렇게 더블 포인터로 한 것이다

 

코드 예시

#include "Header.h"

struct marine {
	int hp = 40;
	int mp = 20;
	int atk = 2;
};

int main() {
	marine** m;
	m = (marine**)malloc(sizeof(marine*) * 20);

	for (int i = 0; i < 20; i++) {
		m[i] = (marine*)malloc(sizeof(marine));
		m[i]->atk = 8;
	}

	for (int i = 0; i < 20; i++) {
		printf("%d\n", m[i]->atk);
	}

	return 0;
}

if 구조체인데 이중 포인터다?

->동적 할당된 1차원 배열

 

int** <-2차원 배열

struct <-가 있으면 ** 1차원 배열

 

함수의 파라미터 포인터

파라미터의 포인터는 단순히 변수의 주소값을 받기 위함일 수 있지만 배열 변수를 받기 위함일 수 도 있다

 

구분하는 방법은 보통 배열일 경우 배열의 갯수를 알려주는 변수를 따로 파라미터로 받게 된다

 

int foo(int* v, int size); <-배열일 가능성이 높음
int goo(int* v); <- 한개의 값만을 필요로 할 가능성이 높음

 

#include "Header.h"

void foo(int* a, int count) {
	for(int i = 0; i < count; i++) {
		printf("%d\n", a[i]);
	}
}

int main() {
	int array[5] = { 4, 6, 10, 20, 100 };
	foo(array, 5);
	return 0;
}

int* a <-만약 이게 배열이라면 옆에는 꼭 숫자를 받는다. 

 

const char*

const char* 에는 strcpy를 사용할 수 없다.

 

파라미터의 const char*

하드코딩된 문자열을 넣을 수 있지만, 문자열의 배열도 파라미터로 집어넣을 수 있다.

 

cahr*, char 배열 등등의 변수 이름은 모두 const char*의 파라미터 형식으로 받을 수 있다.

 

예시 코드

#include "Header.h"

void foo(const char* str) {
	printf("%c", str[1]);
}

int main() {
	char* str = (char*)malloc(sizeof(char) * 12);
	strcpy(str, "Hello World");
	foo("hello world");
	return 0;
}

이렇게 실행하면 2번째 글자인 e가 나올것이다.

 

그냥 이렇게 쓴다 정도만 알면 된다.

 

void*

void* 는 어떠한 포인터도 될 수 있는것

모든 포인터의 기본형

 

다른 포인터 타입에서 vodi* 으로 변환될 땐 자동 형변환 void* 에서 다른 포인터 타입으로 변환될 땐 형변환 명시