배열의 구조 : 자료형 배열이름 [크기][크기]…;
배열 요소 접근 방법 : 인덱스
배열의 초기화
배열과 메모리
다차원 배열
배열이 원소를 배열로 갖는 것이 다차원 배열. 즉, 배열의 배열. 3차원 이상의 배열도 가능
ex) int arr2 [3][4]; →
2차원 배열의 메모리상의 구조
2차원 배열 요소의 접근 방법
2차원 배열 초기화
포인터는 메모리 공간의 주소를 값으로 갖는 변수
포인터 선언
&연산자
#include <stdio.h>
int main(void)
{
int a = 2005;
printf(“변수 a의 메모리 주소는 %d입니다.\n”, &a);
printf(“변수 a의 메모리 주소는 %X입니다.\n”, &a);
return 0;
}
/*
<결과>
변수 a의 메모리 주소는 1245024입니다. 변수 a의 메모리 주소는 12FF60입니다.
*/
*연산자
void main(void) {
int * ptr;
int a = 21;
ptr = &a; //pointer 변수 ptr에 &a(a의 메모리 주소)를 저장
printf(“%d\n”, ptr);
printf(“%d\n”,*ptr); //*pa는 변수 a자체를 의미
}
/*
<결과>
12345678
21
*/
포인터 변수의 자료 유형이 다양하게 존재하는 이유?
포인터 변수는 가리키는 자료유형에 상관없이 모두 4byte로 크기가 똑같다. (메모리의 주소가 4byte이기 때문)
포인터는 자료의 첫 번째 byte(첫번째 메모리공간)을 가리킨다. → 자료유형에 따라 메모리를 참조할때 몇 byte를 읽어하는지를 알아야함.
포인터 형 변환
#include <stdio.h>
#include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일
int main()
{
int *numPtr = malloc(sizeof(int)); // 4바이트만큼 메모리 할당
char *cPtr;
*numPtr = 0x12345678;
cPtr = (char *)numPtr; //int포인터 numPtr를 char 포인터로 변환. 메모리 주소만 저장됨
printf("0x%x\n", *cPtr); //0x78: 낮은 자릿수 1바이트를 가져오므로 0x78
free(numPtr); //동적 메모리 해제
return 0;
}
/*
<결과>
0x78
*/
포인터 변수의 초기화
#include <stdio.h>
int main (void)
{
int a[5] = {1, 2, 3, 4, 5};
printf ("%d, %d\n", a[0], a[1]);
printf ("%d, %d\n", &a[0], &a[1]);
printf ("배열 이름 : %d\n", a); // 배열의 이름을 출력하면 포인터와 같이 메모리 주소가 출력
return 0;
}
/*
<결과>
1, 2
1245008, 1245012
배열 이름 : 1245008 //배열의 시작주소
*/
#include <stdio.h>
int main (void)
{
int a[5] = {1, 2, 3, 4, 5};
int b = 10;
a = &b; //a는 상수 포인터이므로 에러!!!!
return 0;
}
#include <stdio.h>
int main (void)
{
int arr[3] = {1, 3, 5};
int *ptr;
ptr = arr;
printf ("ptr[0] : %d\n", ptr[0]);
printf ("ptr[1] : %d\n", ptr[1]);
printf ("ptr[2] : %d\n", ptr[2]);
return 0;
}
/*
<결과>
ptr[0] : 1
ptr[1] : 3
ptr[2] : 5
*/
: 포인터 값을 증가 혹은 감소시키는 연산
→ 포인터가 참조하는 부분을 연산하는 것이 아니라 포인터 안에 저장된 주소값을 증가시키거나 감소시키는 것을 의미
#include <stdio.h>
int main (void)
{
char *ptr1=0; //포인터를 0으로 초기화시키면 아무것도 가리키지 않는다는 의미
int *ptr2=0;
double *ptr3=0;
printf ("증가시키기 전 : %d %d %d\n", ptr1, ptr2, ptr3);
printf ("1증가시킨 후 : %d %d %d\n", ++ptr1, ++ptr2, ++ptr3);
printf ("추가로 3증가 : %d %d %d\n", ptr1+3, ptr2+3, ptr3+3);
return 0;
}
/*
<결과>
증가시키기 전 : 0, 0, 0
1증가시킨 후 : 1, 4, 8
추가로 3증가 : 4, 16, 32
*/
#include <stdio.h>
int main (void)
{
int a[5] = {1, 2, 3, 4, 5};
int *pArr=arr;
printf ("%d\n", *pArr);
printf ("%d\n", *(++pArr));
printf ("%d\n", *(++pArr));
printf ("%d\n", *(pArr+1)); //포인터 연산을 이용해 배열을 다룰때
printf ("%d\n", *(pArr+2)); //범위를 넘어가는 연산을 하지 않도록 주의
return 0;
}
/*
<결과>
1
2
3
4
5
*/
#include <stdio.h>
int main (void)
{
int a[53] = {1, 2, 3};
int *pArr=arr;
printf ("%d %d\n", arr[0], arr[1]);
printf ("%d %d\n", *arr, *(arr+1));
printf ("%d %d\n", pArr[0], *(pArr+1));
return 0;
}
/*
<결과>
1, 2
1, 2
1, 2
*/
2차원 배열 이름
#include <stdio.h>
int main()
{
int a[3][2] = {1,2,3,4,5,6};
printf("a[0] : %d\n", a[0]);
printf("a[1] : %d\n", a[1]);
printf("a[2] : %d\n", a[2]);
printf("a : %d\n", a);
}
/* <결과>
a[0] : 1245004
a[1] : 1245012
a[2] : 1245020
a : 1245004
*/
2차원 배열 이름과 연산
#include <stdio.h>
int main()
{
int a[3][2] = {1,2,3,4,5,6};
printf("a[0] : %d\n", a[0]);
printf("a[1] : %d\n", a[1]);
printf("a[2] : %d\n", a[2]);
printf("a[0] + 1: %d\n", a[0]+1);
printf("a[1] + 1: %d\n", a[1]+1);
printf("a : %d\n", a);
printf("a+1 : %d\n", a + 1);
printf("a+2 : %d\n", a + 2);
return 0;
}
/* <결과>
a[0] : 2030040
a[1] : 2030048
a[2] : 2030056
a[0] + 1 : 203044
a[1] + 1 : 203052
a : 2030040
a+1 : 2030048
a+2 : 2030056
*/
2차원 배열의 포인터 타입 비교
#include <stdio.h>
int main()
{
int arr1[4][2]; //arr1은 2개씩 4개이기 때문에 8씩 증가
int arr2[2][4]; //arr2은 4개씩 2개이기 때문에 16씩 증
/*arr1은 8씩 증가하지만 arr2는 16씩 증가한다. 따라서 arr1과 arr2는
같은 2차원 배열이지만 포인터 타입이 다르다.*/
printf("arr1 : %d\n", arr1);
printf("arr1+1 : %d\n", arr1+1);
printf("arr1+2 : %d\n", arr1+2);
printf("arr2 : %d\n", arr2);
printf("arr2+1 : %d\n", arr2+1);
printf("arr2+2 : %d\n", arr2+2);
return 0;
}
/* <결과>
arr1 : 1244996
arr1+1 : 1245004
arr1+2 : 1245012
arr2 : 1244956
arr2+1 : 1244972
arr2+2 : 1244988
*/
2차원 배열과 포인터
#include <stdio.h>
int main()
{
int a[3][2] = {1,2,3,4,5,6};
printf("*a[0] : %d\n", *a[0]);
printf("*(a[0]+1) : %d\n", *(a[0]+1));
printf("*(a[1]+1) : %d\n", *(a[1]+1));
printf("*(a[2]+1) : %d\n", *(a[2]+1));
printf("*(a[0]+3) : %d\n", *(a[0]+3));
printf("*(a[0]+4) : %d\n", *(a[0]+4));
return 0;
}
/*<결과>
*a[0] : 1
*(a[0]+1) : 2
*(a[1]+1) : 4
*(a[2]+1) : 6
*(a[0]+3) : 4
*(a[0]+4) : 5
*/
#include <stdio.h>
int main()
{
int val = 4;
int *ptrl1 = &val; //싱글포인터
int **ptrl2 = &ptrl1; //더블포인터
return 0;
}