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 |