본문 바로가기
CS-SQL-DB

Array, Pointer 배열과 포인터

by Jann 2022. 4. 22.
728x90

Array, Pointer 배열과 포인터

 

포인터

: 변수의 주솟값을 저장하는 공간

 

포인터 선언 : 데이터타입(int) * 포인터_변수명(b) =&변수명 (&a)

int a =10;
int*b = &a;

int* : 정수만 가리키는 포인터

& : 주솟값을 가리킴

 

1차원 배열과 1차원 포인터

: 1차원 배열에서 배열명만 단독으로 사용할 경우 1차원 포인터와 동일하다.

1차원 배열일 때 배열명[요소]형태 ::a[0] , *(배열명+요소) :: *(a+1) , 1차원 포인터일 때 포인터[요소] :: p[0] 형태, *(포인터+요소) :: *(p+1)일 경우 값을 가리킴

배열의 주소 배열명 == 배열명[0]
배열의 0번지 값 배열명[0] == *배열명

 

1차원 배열과 1차원 포인터 예시

int a[3] = {1, 2};
int *p = a; // int *p = &a[0]; 과 동일

1차원 배열과 1차원 포인터 예시

 

2차원 배열과 1차원 포인터

: 2차원 배열에서 배열명만 단독으로 사용할 경우 2차원 포인터와 동일

2차원 배열일 때 배열명[요소] 형태, *(배열명+요소)는 1차원 포인터와 동일 :: int a[2][2] ,a[2]  *(a+2)

1차원 포인터에 대해 *과 [ ]을 이용해야 값을 가리킬 수 있다. *(a+2) == a[2]

 

 

2차원 배열과 1차원 포인터 예시

inta[3][2] = {1,2,3,4,5,6};
int*p = a[1];

 

2차원 배열과 1차원 포인터 예시

a[1] == *(a+1) ,

*(a[1]) == *(*(a+1)) == **(a+1)

 

따라서, 위의 배열에서 

*a[0], *a[1], *a[2] **a, **(a+1), **(a+2) 값은 각 각, 1,3,5 - 1,3, 5를 가리킨다.

*p, *(p+1), *(p+2) 값과 p[0], p[1], p[2] 값은 각 각, 3,4,5 - 3,4,5를 가리킨다. 

 

2차원 배열과 포인터 배열

+ 포인터배열 = 포인터가 여러개 들어있는 구조

inta[3][2] = {1,2,3,4,5,6};
int*p[3] = {a[2], a[0], a[1]};

int*p[3] : 정수형 포인터의 배열[]

 

2차원 배열과 포인터 배열 예시

 


2차원 배열과 2차원 포인터

 

: 2차원 배열에서 배열명만 단독으로 사용할 경우 2차원 포인터와 동일하고,

2차원 배열일 때 배열명[요소][요소], *배열명[요소], **(배열명+요소)일 경우 값을 가리킨다.

 

inta[3][2] = {1,2,3,4,5,6};
int(*p)[2] = a;
int(*q)[2] = a+1;

int(*p)[2] : 2차원 배열 중 2를 가리키는 포인터

-> p = a;

-> q = a+1;

 


1차원 배열과 문자열

 

: 문자열을 초기화할 때 마지막에 NULL 문자가 삽입되므로, 초기화하는 글자 수보다 1이상 큰 값으로 배열을 선언한다.

초기화할 때 배열의 크기를 명시하지 않으면, 문자열의 문자수 + 1만큼 자동으로 생성되고, printf 함수에서 %s를 이용해 문자열을 읽고 출력, printf 파라미터로 문자를 읽기 시작할 시작 주소를 알려주면 시작 주소부터 NULL 직전 값까지 읽어서 출력한다.

 

char a[6] = "Java"; 일 경우의 예시

 

1차원 배열과 문자열 예제

 

printf(%s)이면, * 시작점에서 NULL 직전 값까지 출력할 것!

printf(%c)이면, * 시작점의 char 하나만 출력할 것!

 


2차원 배열과 문자열

: 문자열 여러 개 정의할 때 2차원 배열을 사용한다. printf 함수에서 %s 이용하여 문자열을 읽고 출력하는데, printf 파라미터로 문자를 읽기 시작할 시작 주소를 알려주면 시작 주소부터 NULL 직전 값까지 읽어 출력한다.

 

 

728x90

댓글