study/C언어

배열(Array) 과 포인터(Pointer)

IT공부 2020. 3. 31. 18:12
반응형

배열(Array) 이란?

배열은 같은 타입의 변수들로 이루어진 유한 집합으로 정의됩니다.

 

배열을 구성하는 값을 배열 요소(element)라고 하며, 배열 위치를 나타낸 숫자를 인덱스(index)라고 합니다.

 

1차원 배열

 

타입 배열 이름[상수];

 

타입 배열 이름[ ] = {배열 요소 1, 배열 요소 2,....};

 

 

2차원 배열

 

타입 배열 이름[행][열];

 

포인터(Pointer)

 

주소 값의 이해

 

데이터의 주소 값이란 해당 데이터가 저장된 메모리의 시작 주소를 의미합니다. 

C언어에서는 이러한 주소 값을 1바이트 크기에 메모리 공간으로 나누어 표현합니다. 

 

예를 들어, int 형 데이터는 4바이트의 크기를 가지지만, int형 데이터의 주소값을 시작 주소 1바이트만 가리킵니다.

 

 

C언어에서 포인터(pointer) 란 메모리의 주소 값을 저장하는 변수이며, 포인트 변수라 부르며, 

char형 변수가 문자를 저장하고, int형 변수가 정수를 저장하는 것처럼 포인터는 주소값을 저장

 

 

예제) 

 

int n = 100;     // 변수의 선언

int *ptr = &n ; //포인터의 선언

 

포인터 연산자

C언어에서 포인터와 연관되어 사용되는 연산자는 다음과 같습니다. 

 

1. 주소 연산자(&) 

2. 참조 연산자(*)

 

 

주소 연산자 

 

주소 연산자는 반드시 변수의 이름 앞에 사용하며, 해당 변수의 주소 값을 반환한다. 

'&' 기호는 엠 퍼센트(empersand)라고 읽으며, 번지 연산자라고 합니다. 

 

참조 연산자

 

참조 연산자는 포인터의 이름이나 주소 앞에 사용하며, 포인터에 가리키는 주소에 저장된 값을 나타낸다.

 

 

포인터의 포인터

 

포인터의 포인터란 포인터 변수를 가르키는 포인터를 의미합니다. 

참조 연산자(*)를 두 번 사용하여 표현하며, 이중 포인터라고도 합니다. 

 

예제) 

 

int n = 100;              // 변수 선언

int* ptr_n = &n         // 포인터 선언

int* pptr_n = &ptr_n  // 포인터의 포인터 생성

 

 

void 포인터(void pointer)

 

void 포인터는 일반적인 포인터 변수와는 달리 대상이 되는 데이터의 타입을 명시하지 않은 포인터

따라서 변수, 함수, 포인터 등 어떠한 값도 가리킬 수 있다 

즉, void 포인터는 주소 값을 저장하는 것 이외에도 아무것도 할 수 없는 포인터입니다. 

 

함수 포인터의 포인터 타입은 함수의 반환 값과 매개변수에 의해 결정됩니다. 

 

원형 

void func(int, int);

함수 포인터 

void (*ptr_func) (int, int);

 

 

포인터와 배열의 관계 

 

포인터와 배열은 매우 긴밀한 관계를 맺고 있으며, 어떤 부분에서는 서로를 대체할 수도 있다. 

 

배열의 이름은 그 값을 변경할 수 없는 상수라는 점을 제외하면 포인터와 비슷합니다. 

 

예제)

int arr [3] = {10, 20 ,30};       //배열 선언

int* ptr_arr = arr;               //포인터에 배열의 이름을 대입함

printf("%d %d % d\n", arr [0], arr [1], arr [2]);

 

배열의 포인터 연산 

 

배열의 이름을 포인터처럼 사용하는 예제입니다. 

 

예제)

int arr [3] = {1, 2, 3};    //배열 선언

printf("%d %d %d " , arr [0] , arr [1] , arr [2]);

printf("%d %d %d " , *(arr+0) *(arr+1) *(arr+2));

 

 

포인터 배열

 

포인터 배열이란 배열 요소로 포인터 변수를 가지는 배열을 의미합니다. 

즉, 포인터 변수를 저장할 수 있는 배열입니다. 

 

int i , arr_len;

int num1 = 10, num2 = 20, num3 = 30;

int * arr [3] = {&num1, &num2, &num3};  //int형 포인터 배열 선언

 

arr_len = sizeof(arr) / sizeof(arr [0]);

 

for(i=0; i <arr_len; i++)

{

  printf("%d\n" , *arr [i]);

}

 

포인터 배열과 배열 포인터의 구분

 

1. int (*pArr)[3];

// int형 데이터를 저장할 수 있는 2차원 배열을 가리키는 배열 포인터

 

2. int* pArr [3];

// int형 데이터를 가리킬 수 있는 포인터 변수를 모아 놓은 배열 

 

 

 

void (또는 int) main(int argc , char* argv [])

//int형 변수인 argc로 main() 함수에 인수로 전달되는 문자열의 개수를 명시합니다.

//char형 포인터 배열인 argv는 main() 함수에 인수로 전달된 각각의 문자열이 저장된 배열을 가리킨다.

'study > C언어' 카테고리의 다른 글

[c언어] 입출력 정리  (0) 2020.04.02
인수 전달 방법  (0) 2020.03.31
함수(Function) 란?  (0) 2020.03.31
스택 프레임(Stack frame)  (0) 2020.03.31
[C언어] printf 함수와 scanf 기본적인 이해  (0) 2019.12.20