안녕하세요! 오늘은 8번째 시간입니다!
포인터는 c언어 기초에서 꽃이라고 할 수 가 있어요! 이해하기 조금 어렵습니다! 근데 이게 자료구조랑 알고리즘 공부할 때 필수적으로 사용하는 것이니 꼭 이해하고 넘어가주세요!!
바로 소스코드 먼저 보실게요~
Line 4 : int a[3] = {1,2,3};을 해줌으로서 a[0]에 값을 1로 초기화시키고 a[1]에는 값을 2로 초기화시키고 a[2]에는 값을 3으로 초기화를 시켰습니다. 배열 선언을 함과 동시에 초기화를 해줌을 알 수 있습니다.
Line 5 : 자 이제 포인터 공부의 시작이라고 할 수 있어요! 5번 라인을 말 그대로 해석해보면 'int 자료형을 가리키는 포인터 변수 p를 선언하는데 a의 주소값을 p의 값으로 할당하겠다.'라는 의미입니다. 조금 있다가 설명드릴게요~
Line 6~7 : 변수 a의 주소값과 변수 p의 값을 출력하는 것입니다. 일단 여기서 중요한 점은 배열에서의 시작 주소 값을 알기 위해서는 a라고만 적으셔도 되고 &a[0]라고 적으셔도 됩니다. &a[0]의 뜻은 a의 0번째 원소의 주소값을 뜻하는 건데 a의 0번째 원소의 주소값이나 a의 주소값이나 같습니다. 다만 &a를 할 경우 &&a[0]과 같은 의미가 되어서 a만 입력하실 경우에는 &를 사용하지 않으셔야 합니다.
Line 6~7(출력창) : a : 00CFFDF0, p : 00CFFDF0 와 같이 a의 주소값과 p안에 있는 값이 같은 것을 확인하실 수 있습니다. 즉 해석한다면 '포인터 변수 p가 a를 가리킨다'라고 해석하시면 됩니다. 즉, 'p라는 변수는 다른 메모리에 저장이 되어 있는데 그 변수 안의 내용에 a의 주소값이 들어가 있다.'라고 생각하시면 됩니다.
Line 8 : 출력창과 함께 해석을 해보자면 p의 주소값을 출력을 하는 것이라서 &p를 하게 될 경우 p가 있는 메모리 주소가 나온 것입니다. 다만 p에 있는 값은 a의 주소값입니다.
Line 9~14 : 먼저 '* 기호는 가리키는 값'이라고 해석하시면 됩니다. a[0]이랑 *a랑 같습니다. 왜냐하면 &a[0]이랑 a랑 값이 같다고 했었죠? 그렇다면 a[0]랑 *a랑 값이 같을 수 밖에 없습니다. 같은 메모리 영역을 가리키기 때문입니다. 따라서 *a를 할 경우 a[0]의 값 1이 출력됩니다. p가 가리키는 주소에 있는 값은 어떻게 출력을 할까요? p의 값이랑 a랑 같다고 했었죠? 그렇다면 *p를 하시게 되면 a[0]의 값 1이 출력이 됩니다. 같은 원리로 *a+1과 *p+1이 같고 a[0]+1을 해준 값 2가 출력이 됩니다. 하지만 *p+1만 해줄 경우에는 2로 출력은 되지만 메모리 내부의 변수 값은 증가하지 않습니다. 만약 변경하고 싶으시다면 *p++과 같은 증감연산자를 이용해주시면 됩니다. 그리고 a[1]이나 a[2]의 값을 출력하고 싶을 때에는 어떻게 해야할까요?
맞습니다. 주소값 +1을 하게 된다면 자료형만큼 +연산이 일어납니다. 따라서 int 자료형이 차지하는 4byte만큼 주소가 더해지므로 다음 인덱스의 값인 a[1] 값이 출력이 될 것입니다. 포인터 기초적인 것은 여기서 마무리 하겠습니다.
최대한 쉬운 예제로 설명을 드리려고 노력을 했습니다.
Line 9~14 설명하고 마지막으로 설명 드린거 꼭 기억해주세요! 큰 틀만 이해하고 심화로 들어가도 틀은 변하지 않기 때문에 꼭 기억 나실겁니다.
'IT > C언어' 카테고리의 다른 글
C언어 예제 - 프로젝트 회사 프로그램 만들기(2) (1) | 2020.04.06 |
---|---|
C언어 예제 - 프로젝트 회사 프로그램 만들기(1) (1) | 2020.04.05 |
C언어 기초 문법- 구조체 기본 구조, 구조체 malloc,free 응용하기, 구조체 size 알기 (0) | 2020.04.02 |
C언어 기초 문법 - malloc, free, 메모리 동적할당을 담당하는 함수 (0) | 2020.03.31 |
C언어 기초 문법 - 아스키코드, 배열, 문자열 입력 출력, 알파벳 대소문자 변경에 대해서 배우기! (0) | 2020.03.29 |