제 21장 포인터와 배열의 이해! 함께 이해하기 - 1
※ 배열과 포인터의 상관관계를 이해하는 시간을 가져볼까요~
● 배열의 이름의 정체
- 배열의 이름 : 첫번째 요소의 주소값을 나타낸다.
(0번째 인덱스의 주소값)
ex) &A[0] : "A배열의 0번째 요소의 주소값을 반환하라."
- "포인터 == 주소값 + 자료형 ( 아주 중요 )"
- 배열이름도 포인터다. 배열이름 ==>> (상수)포인터
- 배열이름 : 주소값 + 자료형
● 배열 이름의 타입
- 배열이름도 포인터이므로 타입이 존재
- 배열 이름이 가리키는 배열요소에 의해 결정
ex) int arr1[10] => int*
double arr2[20] => double*
※ 자, 지금내용부터는 매우 중요하기에 차근차근 읽고 실습해 보자구요
● 배열 이름의 활용(배열이름도 포인터다, 다만 배열이름은 상수이다)
- 배열 이름을 포인터처럼, 포인터를 배열 이름처럼 활용하는것이 가능
예제)=============================================================
#include <stdio.h>
int main()
{
int a[5] = {1, 2, 3, 4, 5}; // 요소개수가 5개인 배열 a를 선언 및 초기화
int* p; // 포인터 p를 선언
p = a; // a배열의 이름은 a[0]의 주소값이기때문에 &를 붙일이유가 없다.
// p라는 포인터가 a를 가리킨다
printf("%d %d %d %d %d \n", p[0], p[1], p[2], p[3], p[4]);
printf("%d %d %d %d %d \n", a[0], a[1], a[2], a[3], a[4]);
p = &b; // 가르키는 값을 변경가능
printf("%d \n", *p);
return 0;
}
// a라는 (배열)상수 포인터는 무조건 a[0]만 가리킬수 있어서, 변경불가능
// p는 일반포인터이기 때문에 변경가능함
=================================================================
● 포인터 연산 : 포인터가 지니는 값을 증가 혹인 감소시키는 연산을 의미한다.
; 포인터가 가리키는 대상의 자료형에 따라서 증가및 감소되는 값이 차이를 지닌다.
ex) ptr++;
ptr +=3;
--ptr1;
ptr2 = ptr1 + 2;
예제)=============================================================
#include <stdio.h>
int main(void)
{
int* ptr1 = 0; // 0번지가 아니고 NULL 포인트 즉, 아무것도 가리키고 있지 않다.
char* ptr2 = 0; // 참고) 별로 좋지 않은 선언이다.
double* ptr3 = 0;
printf("%d번지, %d번지, %d번지 \n", ptr1++, ptr2++, ptr3++);
printf("%d번지, %d번지, %d번지 \n", ptr1, ptr2, ptr3);
return 0;
}
// int형은 4바이트, 4만큼 증가
// char형은 1바이트, 1만큼 증가
// double형은 8바이트, 8만큼 증가
// 그 포인트가 자료형의 따라서 그 증가값이 증가한다.
예제)=============================================================
#include <stdio.h>
int main()
{
int arr[5] = {1, 2, 3, 4, 5};
int* Arr_P = arr; // 현재 Arr_P는 a[0]를 가리킴
printf("%d \n", *Arr_P); // Arr_P가 가리키는 값출력 : 1
printf("%d \n", *(++Arr_P)); // Arr_P의 주속값 4바이트 증가, 그 요소값 출력 : 2
printf("%d \n", *(++Arr_P)); // Arr_P의 주속값 4바이트 증가, 그 요소값 출력 : 3
printf("%d \n", *(Arr_P+1)); // Arr_P의 주속값 4바이트 증가, 그 요소값 출력 : 4
printf("%d \n", *(Arr_P+2)); // Arr_P의 주속값 8(2*4)바이트 증가, 그 요소값 출력 : 5
return 0;
}
그림참고 )
// 최종적으로 지금 Arr_P가 가리키는 상태는 3을 가리키고 있다.
'프로그래밍 > C' 카테고리의 다른 글
제 23장 포인터와 함수에 대한 이해 - 1 (0) | 2010.07.10 |
---|---|
제 22장 포인터와 배열의 이해! 함께 이해하기 - 2 (0) | 2010.07.10 |
제 20장 포인터의 이해 - 그림표현 (0) | 2010.07.10 |
제 19장 포인터의 이해 - 예제분석 (0) | 2010.07.10 |
제 18장 포인터의 이해 - 2 (0) | 2010.07.10 |