자료구조

[ 자료구초 기초] Array, 배열

aliceintr 2021. 4. 13. 09:25
반응형

 

배열에 대해 알아보도록 하자

 

배열 인덱스와 포인터

동일한 데이터 타입의 변수 여러 개를 하나로 묶어서 관리하기 위한 자료구조이다.

메모리 상에 연속된 공간에 위치함

각각의 원소를 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 
}
반응형