본문 바로가기
개발 공부/C언어

#13 C언어 변수형태/상수형태 배열과 포인터의 차이점과 공통점

by 반달bear 2022. 8. 2.
반응형

 

한 줄 요약 

 

포인터와 배열의 차이 

- 문자열이 저장되는 곳이 다르다.

포인터와 배열의 공통점

- 둘 다 주소값을 가진다.

 


 

제가 C언어를 이해하는 데에 있어서 제일 중요한 한가지를 꼽자면

[배열의 이름] [배열의 시작주소 값]이다. 일 것입니다.

 

 

int Arr[3] ; 일때 

Arr을 단독으로 변수처럼 코드에 쓰면 무조건 Arr 배열의 시작주소값을 의미합니다.

 

 

int Arr[3] ;

int * ptr = Arr ; 이란 코드에서 

int * ptr = Arr ; 은

Arr 배열의 시작주소 값을 ptr에 저장하겠다는겁니다.

 

 

그럼

Arr[1] = *(Arr+1) ; 

인 것도 이해할 수 있으시겠나요?

Arr[1] 과 *(Arr+1)은 완전히 같은 말입니다. 

 

 

 

포인터가 잘 이해안가시는 분은 이 글을 참조하시면 됩니다.

#11 C언어 *와 &가 헷갈려서 포인터를 쉽게 설명해 보았다 (tistory.com)

 

 
 

 


 

char str[] = "good" ;

char * str = "good" ;

의 경우

 

배열은 상수형태의 포인터이며, 변수형태의 문자열 입니다.

포인터는 변수형태의 포인터이며, 상수형태의 문자열 입니다.

 

 

배열에는 good이 저장되기에 항상 good의 첫번째 주소를 가르키게됩니다.

근데 문자열 자체는 str[2] = 'c' ; 이런식으로 다른 문자를 저장할 수 있고 이게 다른 점이라고 할 수 있습니다.

즉 문자열 상수 good으로 고정되진 않기에 변수형태!

배열의 시작 주소값은 good이 저장되어 있는 메모리 첫번째 주소로 고정되어 있기에 상수형태!

 

 

포인터는 good을 메모리에 저장하고 이 저장된 값의 첫번째 주소를 가르킵니다.

근데 포인터는 집주소 변수니까 언제든지 다른 집주소 변수를 저장할 수 있고 이 부분이 차이점입니다.

 

 

포인터는 배열과 다르게 포인터에 저장된 값이 언제든지 변할 수 있는 변수형태 포인터입니다

한편 포인터가 가르키고 있는 메모리에 저장된 good은 우리가 배열처럼 중간에 바꿀 수가 없습니다.

포인터와 함께 초기화된 문자열은 메모리에 저장된 이후 포인터에 그 주소값을 저장되어 사용됩니다. 

메모리에 저장된 '문자열' 자체는 임의적으로 저장되는 것이기에 주소를 알아내서 강제로 바꿔주지 않는 이상 저희가 간편하게 바꿀 수는 없는 것이죠. 그래서 문자열은 상수형태 라고 할 수 있습니다.

 

 

포인터와 배열의 차이는 

기본적으로 문자열이 저장되는 곳이 다르다고 할 수 있습니다.

배열은 문자열이 배열에 차례대로!

포인터는 문자열이 임의적으로 메모리에!

저장됩니다.

 

반응형

댓글