[C] 배열과 포인터 2

2021. 1. 8. 12:58프로그래밍 공부/C 공부

배열과 포인터의 관계에 대해서 알았다. 

어떤식으로 활용할 수 있을까? 

 

배열의 요소들을 조작하는데 포인터가 활용될 수 있는건 기본이다.

#include <stdio.h>

void main()
{
	char arr[5] = { 1,2,3,4,5 };
	char size = sizeof(arr);
	int result = 0, sum = 0 , i;
	char *p = arr; // arr 배열의 시작주소를 참조하는 것과 같음.

	for(i = 0; i < size ; i++) 
	{
		printf("%d + %d = %d\n", sum, *p, sum + *p);
		sum = sum + *p;
		*p++;

	}
	
}

 

아예 배열과 포인터를 혼합한 문법을 구사할 수 있다. 

 

(1) 배열 -> 포인터

#include <stdio.h>

void main()
{
	char var1, var2 , var3, var4, var5
	char *p[5] = {&var1, &var2, &var3, &var4, &var5}
	for(int i =0 ; i < 5 ; i++)
	{
		*p[i] = 0;
	}
}

char *p[5] 가 의미하는 것은 무엇일까? 포인터인데 배열이다. 

char *p[5]에서 *연산보다 [ ] 연산의 우선순위가 높기 때문에 char *(p[5]) 와 같다. 

즉, 다섯 공간을 가진 배열 p를 선언하고, 이 배열 자체를 char형 포인터로 만드는 것이다. 

이렇게 하면 각각의 배열의 공간은 p[0] ~ p[4] 의 개별 포인터를 가진 것이다.

 

배열 -> 포인터는 한번에 여러개의 포인터를 선언하고 관리해야할때 유용하게 쓰인다.

 

*포인터는 4바이트가 부여되기 때문에 배열 p의 크기는 5바이트가 아닌 20바이트이다. 

 

(2) 포인터 -> 배열

그렇다면 배열과 포인터의 연산순서가 바뀐다면 어떻게 될까?

#include <stdio.h>

void main()
{
	char (*p)[5];
}

*p 연산에 ( ) 를 사용했기 때문에  [5] 보다 포인터가 먼저 생성된다. 그리고 그 포인터에 char[5] 이 부여됨으로써 해당 포인터 p는 char[5]짜리 배열을 가리키게 된다. 

 

따라서 (*p)[5] 에 값을 부여하기 위해서는 아래와 같이 배열 번호를 지정해줘야한다.

	(*p)[0] = 4; 

 

포인터 -> 배열은 어떨때 사용할까? 1차원 배열을 가리키는 용도로 쓰기에는 char *p 이 더 편하지 않을까?

이러한 표현은 2차원 배열을 다룰때 적합하다.

포인터로 1차원을 선언하고 그뒤에 배열로 1차원을 추가로 더 선언하기 때문이다. 

#include <stdio.h>

void main ()
{ 
	char arrxy[2][5];
	char (*p)[5];
	p = arrxy; // 혹은  p = &arrxy[0];

	*p[0] = 1;
	*(p+1)[0] = 6;
    
    printf("%d %d", arrxy[0][0], arrxy[1][0]);
    //결과 값은 0 6 이다.
 }
 

 

char aarxy[2][5]는 메모리 주소를 아래와 같이 행단위로 2개로 나눈 뒤, 열단위로 5개씩 세분화하고 각각의 칸의 크기는 1바이트를 부여하는 구조이다.

 

[메모리라고 생각하자...]

1행(뭉텅이1) 2행(뭉텅이2)
0 ?? ?? ?? ?? 6 ?? ?? ?? ??

 

이때 *p[0] = 1은 p가 부여받은 arrxy[0]의 주소에서 [0]을 첨가한, arrxy[0][0]을 의미하게 되고, 위와같이 0의 값은 arrxy[0][0]에 위치한다.

같은 원리로 *(p+1)[0]은 arrxy[1][0]을 의미하여 그 위치에 6이 위치하게된다.

'프로그래밍 공부 > C 공부' 카테고리의 다른 글

[C] 동적 메모리 할당 및 해제  (0) 2021.01.08
[C] 프로세스와 메모리할당  (0) 2021.01.08
[C] 배열과 포인터  (0) 2021.01.07
[C] scanf 함수 2  (0) 2021.01.07
[C] scanf 함수 1  (0) 2021.01.07