한 줄 요약
포인터와 배열의 차이
- 문자열이 저장되는 곳이 다르다.
포인터와 배열의 공통점
- 둘 다 주소값을 가진다.
제가 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은 우리가 배열처럼 중간에 바꿀 수가 없습니다.
포인터와 함께 초기화된 문자열은 메모리에 저장된 이후 포인터에 그 주소값을 저장되어 사용됩니다.
메모리에 저장된 '문자열' 자체는 임의적으로 저장되는 것이기에 주소를 알아내서 강제로 바꿔주지 않는 이상 저희가 간편하게 바꿀 수는 없는 것이죠. 그래서 문자열은 상수형태 라고 할 수 있습니다.
포인터와 배열의 차이는
기본적으로 문자열이 저장되는 곳이 다르다고 할 수 있습니다.
배열은 문자열이 배열에 차례대로!
포인터는 문자열이 임의적으로 메모리에!
저장됩니다.
'개발 공부 > C언어' 카테고리의 다른 글
#15 C언어 [도전! 프로그래밍3/4번] srand 여러번 쓰면 안되는 이유 (0) | 2022.08.02 |
---|---|
#14 C언어 반복문과 조건문에서의 break; continue; return;의 차이점 (0) | 2022.08.02 |
#12 C언어 포인터 앞에 int double 같은 자료형을 붙여줘야 하는 이유 (0) | 2022.08.02 |
#11 C언어 *와 &가 헷갈려서 포인터를 쉽게 설명해 보았다 (0) | 2022.08.02 |
#10 C언어에서 헷갈리는 따옴표 " ' 구별해서 쓰는 법 (0) | 2022.08.02 |
댓글