Computer Language/C

[C] 문자배열과 포인터, 포인터배열과 배열포인터.

kthdev 2023. 4. 27. 15:18

혹시 틀린 부분이 있으면 지나가지 마시고 댓글로 지적해주시면 감사드리겠습니다. :-)

strcpy에서 뒷쪽에 남는 e \0 값은 strncpy로 null로 채울수 있다. 나중에 다룰 예정.

C언어에서는 문자열을 담는 자료형이 없으므로 두가지 방법으로 문자열을 담을 수 있다.

첫번째는 배열을 이용한것, 두번째는 문자열 주소값을 가진 포인터를 이용하는것.

 

 

 

 

단순하게 보는 메모리의 구조

 

 


 

이 그림과 같이 int a[3][5] 라는 2차원 배열이 있고,

a의 주소는 200이라고 가정했을때,

이 배열을 가르키는 포인터는

int(*p)[5] = a 가 된다.

int*p = a와는 다른데, 

 

 

 

 

이 배열에서 a의 기본 단위는 20바이트가 되므로, a주소값은 200 이라면, a+1 주소값은 204가 아닌 220이 된다.

그러나 int*p = a라고 정의하면, p+1의 주소값은 220이 아닌 204가 되어버려, 1:1 대응이 안되고 다른 의미가 되어버린다. 

따라서 int(*p)[5] = a 와 같은 형태로 지정한다.

근데 여기서 만약에

int* p[5] 라고 선언을 하면 어떻게 될까?

 

그럼 이건 포인터를 모아놓은 포인터 배열이 된다.

이 배열의 내부에는 포인터값(정수포인터) 만 담을 수 있다.

 

셋다 다른 개념인데 비슷하게 생겼으므로, 주의해야한다.