반응형
배열에 대해 알아보도록 하자
배열 인덱스와 포인터
동일한 데이터 타입의 변수 여러 개를 하나로 묶어서 관리하기 위한 자료구조이다.
메모리 상에 연속된 공간에 위치함
각각의 원소를 element 라 하며, index를 사용해서 원하는 요소로 바로 이동
c언어에서 배열은 포인터 타입으로 선언됨
#include <stdio.h>
void main(){
int a[5];
a[0]=2001;
a[1]=2002;
a[2]=2003;
a[3]=2004;
}
이를 그림으로 표현하면 다음과 같다
important!! a는 변수가 포인터 변수다.
#include <stdio.h>
void main(){
short a[5] = {10,20,30,40,50};
printf("a[0] :%d\n\n",a[0]);
printf("a[1] :%d\n\n",a[1]);
printf("*a :%d\n\n",*a);
printf("*(a+1) :%d\n\n",*(a+1));
printf("*(&a[0]) :%d\n\n",*(&a[0]));
printf("*(&a[0]+1) :%d\n\n",*(&a[0]+1));
printf("a :%p\n\n",a);
printf("&a[0] :%p\n\n",&a[0]);
printf("&a[0]+1 :%p\n\n",&a[0]+1);
int total = a[0]+a[1]+(*a)+(*(a+1));
printf("%d\n\n",total);
}
결과는 아래와 같다.
a[0] :10 // a 배열의 1번째 인덱스 값
a[1] :20 // a 배열의 2번째 인덱스 값
*a :10 // a 배열의 첫주소가 가르키는 값
*(a+1) :20 // a+1 즉, a 다음 메모리 상의 값
*(&a[0]) :10 // a[0]은 변수임 따라서 &을 붙이면 포인터가 되고, 이 포인터가 가르키는 값은 10
*(&a[0]+1) :20
a :0x7ffc1e74196e // a 배열의 첫 주소값
&a[0] :0x7ffc1e74196e //a[0]은 변수임 따라서 &을 붙이면 포인터 변수, 즉, 주소값
&a[0]+1 :0x7ffc1e741970
60
Question) int x [100]으로 선언된 배열의 시작 주소 값이 1000이라고 할 때 배열의 x [9] 요소의 주소는 몇 번지 인가?
Answer)
int 는 4byte 메모리를 가진다.
x [9]는 10번째 메모리의 주소이므로
1000 + 4byte * (10-1) = 1036
2차원 배열
행, 열로 구성된 도표를 저장하는데 유리한 자료구조
내부적 여전히 1차원으로 저장되지만 , 외부적으로 2차원으로 표현됨,
행 우선으로 표현됨
a[0][0] = 11 | a[0][1] = 22 | a[0][1] = 33 |
a[1][0] = 44 | a[1][1] = 55 | a[1][2] = 66 |
a[2][0] = 77 | a[2][1] = 88 | a[2][2] = 99 |
int a[3][3] = { {11,22,33},{44,55,66},{77,88,99}};
문자열
C/C++ 에서 String 은 Char의 배열로 표현됨
address | value | variable |
204 | A | name[0] |
208 | l | name[1] |
212 | i | name[2] |
216 | c | name[3] |
220 | e | name[4] |
224 | - | name[5] |
228 | H | name[6] |
232 | O | name[7] |
236 | M | name[8] |
240 | E | name[9] |
char name[10] = "Alice-HOME";
배열 전달
배열은 함수 호출시의 argument로 넘길 수 있다. 주로 배열의 크기와 함께 넘긴다.
C/C++에서 배열 변수는 포인터 역할을 하기 때문에, 배열의 시작 주소가 전달된다.
배열 요소의 합 구하기
#include <stdio.h>
int sum(int a[], int size){
int i , sum = 0;
for (i=0; i <size ; i++){
sum = sum + a[i];
}
return sum;
}
void main(){
int total,a[3] = {100,98,93};
total = sum(a, 3);
printf("total value is %d", total);
}
total value is 291
#include <stdio.h>
int sum(int *a, int size){
int i , sum = 0;
for (i=0; i <size ; i++){
sum = sum + *a;
a = a+1;
}
return sum;
}
void main(){
int total,a[3] = {100,98,93};
total = sum(a, 3);
printf("total value is %d", total);
}
total value is 291
Exercise
#include <stdio.h>
void main(){
short a[3] = {10,20,30};
printf("a[0] :%d\n\n",a[0]); //10
printf("a[1] :%d\n\n",a[1]); //20
printf("*a :%d\n\n",*a); //10
printf("*(a+1) :%d\n\n",*(a+1)); //20
int total = a[0]+a[1]+(*a)+(*(a+1));
printf("%d\n\n",total); // result : 60
}
#include <stdio.h>
int total_value(int arr[], int n){
int i , total = 0;
for (i=0; i <n ; i++){
total = total + arr[i];
}
return total;
}
void main(){
int a[5] = {2,3,4,3,5};
int total = total_value(a, 5);
printf("total value is %d", total);
}
#include <stdio.h>
int func_add(int *a, int *b){
int result;
// point to a[1]
a = a+1;
// point to b[1]
b = b+1;
//*a = 20, *b = 200
result = *a+*b;
return result;
}
void main(){
int a[4]={10,20,30,40};
int b[4]={100,200,300,400};
int result;
result= func_add(a,b);
printf("%d", result); //result = 220
}
반응형
'자료구조' 카테고리의 다른 글
[자료구조 기초] Stack, 스택 (0) | 2021.04.14 |
---|---|
[자료구조 기초] 리스트, 선형 리스트, 단순 연결리스트, Linear List, Linked List (0) | 2021.04.13 |
[자료구조 기초] structure, 구조체 (0) | 2021.04.13 |
[자료구조 기초] Pointer , 포인터 (0) | 2021.04.13 |
[자료구조 기초] 자료구조의 개념, 추상자료형, 알고리즘 성능 분석 (0) | 2021.04.13 |