본문 바로가기

FALL in/G.MA' s C

[C프로그래밍] - 문자배열과 포인터


 문자배열과 포인터

어떤 문자열을 저장하고 싶을때

char str[100] = "G.MA's LOG"; 와 같이 문자배열을 초기화 해줄수 있다.


다른 방법으로

char *ptr = "G.MA's LOG"; 도 가능하다.

위와 같이 하면 메모리에 "G.MA's LOG"가 들어갈 공간을 만들고 "G.MA's LOG"를 넣어준다. 그리고 그 시작주소를 ptr에 넘겨주게된다.


char str[100] = "G.MA's LOG";

char *ptr = str; 

위와같이도 가능하다. 여기서 str은 배열의 이름이자 배열의 시작주소(=&str[0])이다. 배열의 이름은 상수 포인터라고 하기도 하는데 그 주소값이 바뀔수 없기때문이다.

즉 str++;을 실행하면 에러가 난다. 따라서 산술연산을 통해 배열의 원소에 접근하고 싶다면  배열의 시작주소를 저장할 포인터 변수를 따로 만들어야한다.

str[3]은 *(str+3)과 동일하다. 포인터는 자료형의크기만큼 연산이 되므로 str[3]의 주소값인 &str[3]은  str+3과 동일하다. str+3이라는 주소값을따라가서 변수에 접근하기위해 역참조연산자 *을 이용한것이다. 



 포인터 배열


위 배열은 2차원 문자배열이다.

 문자 10개가 들어갈수 있는 배열을 3개 만들어주고 각각 문자열을 초기화 해준 것이다.

단어길이를 예상하지 못하므로 문자열당 넉넉하게 10칸을 잡어주었는데 이렇게 하면 메모리가 낭비될수있다.

남았지만 쓰지않는 메모리가 생기기 때문이다.



위 배열은 포인터의 일차원 배열이다. 

포인터(주소값)이 들어갈수있는 공간 3개를 만들어주고 각각 문자열이 들어갈 공간을 따로 만들고 포인터변수에 그 문자열의 시작주소를 넣어주었다.

따라서 각각의 포인터는 문자열의 시작주소를 가리키게된다.

이렇게 문자열을 저장하게되면 첫주소 저장할 메모리 (포인터배열)이 필요하지만 전체적인 메모리 낭비를 줄일수있다.

남는 메모리가 없기때문이다.