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* 에서 다른 포인터 타입으로 변환될 땐 형변환 명시
'C언어 공부' 카테고리의 다른 글
C언어 - 번외편2 추가 개념 정리 (0) | 2025.03.14 |
---|---|
C언어 심화 - 번외편 (0) | 2025.03.14 |
C언어 심화 - 포인터 3 - 메모리 동적 할당 / 배열 (0) | 2025.03.13 |
C언어 심화 - 포인터 2 (0) | 2025.03.13 |
C언어 심화 - 포인터 1 (0) | 2025.03.13 |