더블포인터를 이용한 동적 문자열 동적 배열

채재헌·2022년 7월 15일
0

🎈목차

1. 1차원 2차원 배열의 동적 메모리 할당

2. 2차원 배열의 동적메모리 할당

3. 더블 포인터의 코드 예시

4. 느낌점


🏆<더블 포인터의 개념> : 더블포인터를 이용한 동적배열은 리눅스 C언어 활용시 많이 등장하는 개념으로 포인트가 변수의 메모리 주소에 저장한다면, 더블 포인트는 그 메모리 주소를 저장한 포인트의 메모리 주소로 저장합니다.


🎆1. 1차원 2차원 배열의 동적 메모리 할당

먼저 2차원 배열의 더블포인터를 이용한 동적 배열을 들어가지 전에 간단하게 1,2차원 동적 메모리 할당에 대해 간단히 알아보고 가겠습니다.

1-(1) 1차원 배열의 동적 메모리 할당이란?

Ex) int*p; 
P =(int*)malloc(sizeof(int)*2);

-위에 나와있는 sizeof는 4바이트이고, 곱하기 2를 하였으니 총 8바이트를 할당하였습니다.
-p에 바로 그 주소값 15를 넣음으로써 이 메모리 공간을 가리키게 해 둡니다. (이것은 실제로
int p[2];와 같이 크기가 2인 int형 1차원 배열을 선언한것과 같은 원리를 갖습니다.)

-p와 p[0]은 실제로 같은 값을 가집니다.
-
(p+1)과 p[1] 역시 같은 값을 나타냅니다.
=>이처럼 포인터를 이용해 동적메모리 할당을 하게 되면 포인터 변수로 마치 1차원 배열을 정적 선언한 것처럼 관리를 할 수 있게 됩니다.


1-(2) 2차원 배열이란 무엇인가?

-2차원 배열이란, 1차원 배열의 원리와 동일하며, 메모리는 행열형태로 구성되어진 것이 아니라 모든 메모리는 1차원 형태의 1행으로 구성되어 있습니다. 즉 순서대로 계속 늘어서있는 것입니다. 2차원 배열을 그림드로 표기할 때는 보통 테이블형태(행렬 형태)로 표기를 하지만 실제로는 1차원배열들이 모여서 2차원 배열이 되는 것입니다.

-ex) int A[3][3];

-A: 배열의 이름이며 배열의 첫 번째 시작 주소 =4
-A+1 :A는 행들의 대표이기 때문에 다음 행을 나타내기 위해 =16


🎇 2. 2차원 배열의 동적메모리 할당

Ex) int*p;
P=(int*)malloc(sizeof(int)*3);

=>위의 형태를 3번 할당하면 모든 메모리가 할당될 것입니다. 2차원 배열을 동적 메모리할당 하기 위해서는 그 1차원 배열의 개수만큼 동적메모리 할당하면 됩니다. 하지만 이처럼 3개의 1차원 배열을 동적메모리 할당을 해놓고서 보면 이것을 생성시켜 사용한다면 이것은 그냥 1차원 배열의 동적메모리 할당이지 2차원 배열이 아닙니다.

그래서 이를 대표할 수 있는 하나의 자료구조는 바로 2차원 배열의 이름입니다.
즉, 이러한 결과들을 종합해보면 1차원 배열을 동적 메모리 할당를 하려면 포인터 변수를 이용합니다, 그런데 2차원 배열은 또 그것들을 원소로 갖는 1차원 배열이고 이것 역시 포인터로 이용해야 하며 바로 여깃 이중 포인터 개념을 생각해야 합니다.

-포인터를 하나의 원소로 갖는 1차원 배열이되어 포인터의 배열을 저장하기 위해서는 포인터
에 포인터를 붙힌 2중 포인터가 필요해지며. 포인터를 할당하려면 포인터의 포인터 타입이 필요합니다.


2.-(2) 2차원 배열(이중포인터 )의 동적 메모리 할당

Ex) intp=NULL;
P=(int
)malloc(sizeof(int )3));// 행들의 배열을 할당
For(int I=0;I<3;I++){
(p+I)=(int)malloc(sizeof(int)*3)); //각 1차원 배열들을 할당

`

-위와 같이 3개의 포인터를 할당합니다.
-3개의 각각의 포인터에 1차원 배열을 할당해야 합니다.

-A는 아래의 3개 1차원 배열들의 배열 이름입니다.
-A의 다음 원소인 주황색 배열을 가르킵니다.
-A+2는 그 다음 원소인 파란색 배열을 가리킵니다.


🔑***<문제 : 여기서 A[2][1]을 포인터로 접근해야 한다면 어떻게 될까 ??>

-(A+2)+1 =>인덱스 기호를 사용하지 않고 순수하게 포인터로 접근하는 방법
=>
(A+2)을 해주어야 파란색 배열이 두 번째 원소의 주소값이 나오며, 마지막으로 여기에 다시
*를 해서 간접참조를 하게 되면 드디어 원하는 파란색 배열의 두 번재 원소에 접근할 수 있게 되는것 입니다.


🧨 3.더블 포인터의 코드 예시

#include <stdio.h>
int main() {
int *numPtr1; // 단일 포인터 선언
int numPtr2; // 이중 포인터 선언
int num1 = 10;
numPtr1 = &num1;// num1의 메모리 주소 저장
numPtr2 = &numPtr1;// numPtr1의 메모리 주소 저장
printf("%d\n",
numPtr2); // 20: 포인터를 두 번 역참조하여 num1의 메모리 주소에 접근
return 0;
}

-위의 코드를 통해 유의 해야할 점
num1 변수에는 정수 변수를 담습니다.
정수 변수를 담고 있는 num1변수의 메모리 주소를 numPrt1 포인터에 저장합니다.
numPrt1 포인터의 메모리 주소를 저장합니다.
numPrt1은 메모리 주소를 담고 있는 포인터이므로, 이후 포인터들의 저장은 중복 포인터로 저장시킵니다.


0개의 댓글