본문 바로가기

프로그래밍/자료구조

자료구조 메모리,포인터,변수 예제

http://blog.naver.com/wlsgkr91/220895124536



메모리

-컴퓨터의 메모리는 데이터를 보관하는 

장소이다. 

-바이터 단위로 주소가 지정된다.


변수

-모든 변수는 주소를 가진다. 

ex) int sum;

   -하나의 정수는 4바이트의 공간을 차지한다. 

   -4바이트의 정수를 차지할수 있는

    int 형 sum이라는 변수를 선언한것이다.


포인터 

-일종의 변수라고 할 수 있다. 

-메모리의 일정 영역을 차지하면서 메모리의 주소를 값으로 가지는 변수.

ex)    Type_name * variable_name; 

                      int     * ptr;

 -variable_name은 선언된 포인터 변수의 이름이다. 

-*은  variable-name이 포인터 변수임을 나타내는 표시이다.

-Type_name은 포인터 변수 variable-name에 저장되는 주소에 저장될 데이터의 유형을 지정해준다. 


*만으로도  이 변수의 타입이 저장되었다고 볼 수 있다. 

*은 변수가 포인터 변수인 것을 알려주는 표시이다. 

&은 변수로 부터 그 변수의 주소를  추출하는 연산자이다. 

ex) int c= 12; 

       int *p; 

       p=&c;

-C라는 정수형 변수가 선언되었고 거기에 12라는 정수 값을 저장.

-P라는 이름을 가진 정수형 포인터변수를 선언.

-포인터 변수 P에 변수 C의 주소를 저장한다. 

-C의 주소를 P에 저장할 수 있는 이유는?? 

P가 메모리 주소를 저장할 수 있는 메모리 변수이기 때문이다.


x 라는 정수형 변수와 y라는 정수형 변수가 선언되었다.

x라는 변수에 1 정수 값을 저장되고 1028번지에 할당한다.

Y라는 변수에  2 정수 값을 저장되고 1024번지에 할당한다. 


정수형을 저장할 수 있는 ip포인터 변수 선언하고 메모리에 ip라는 변수가 할당.

 이 ip변수가 1008번지에 할당이 되었다고 

가정하면, ip라는 포인터 변수에 x의 주소 값을 저장한다.

x의 주소는 1028이니까 1028이라는 값이

ip에 저장이된다. 


y = *ip;

-변수의 선언이 아니라.어떤 포인터 변수 앞에  *이 나오면 포인터 변수가 참조하는 자리가 나타난다.

-이 변수가 가진 값으로 가지고 있는 1028번지에 저장된 값을 나타낸다.

-1028번지에 있는 값은 1이다. 그러므로 y=1이라는 의미가 된다. 


*ip=0;

-ip라는 변수가 저장하고 있는 주소에 0을 써라

-ip가 저장하고 있는 주소는 1028이니까 1028 주소에는 x의 값이 저장되어있지만

-이 x의 값을 0으로 바꾸게 되어 x=0이 된다.  


배열

포인터와 배열의 관계는 매우 연결 관계가

높다. 

int a[10];

-배열의 이름은 a이고 int형 정수를 저장할 수 있는 배열의 길이는 10 이다. 

-배열의 이름은 또하나의 변수가 생긴다고 

보면된다. 

int a[10]; 이렇게 선언 하지만 실제로 만들어지는건 a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9] 이렇게 생성된다. 

-배열의 이름은 배열의 시작 주소를 저장하는 포인터 변수임을 알고 있으면 된다. 


지금까지 정리한 내용으로 코드를 한번 

분석해보겠다. 

#include<stdio.h> 

int calculate_sum(int * array); 

int main(void) 

   int  sum,i,average; 

   int  num[10]; 

     for(i=0;i<10;i++) 

         scanf("%d",&num[i]); 

    sum=calculate_sum(num); 

    average=sum/10; 

    printf("%d\n",average); 

    return 0; 

int calculate_sum(int *array //or(array[])) 

    int   sum, i; 

    sum = 0; 

       for(i=0;i<10; i++) 

          sum =sum + array[i]//*(array+i); 

     return sum; 

}

이 코드는 10개의 정수를 입력하면 10개의 정수의 평균을 계산해서 출력하는 코드이다.


사용자가 입력할 정수 10개를 저장할 배열을 int num[10]이라고 선언.

합을 계산해야되니까 합을 계산하는 함수 int calculate_sum를 만들어서 return 값을 sum으로 해준다. 

이 값을 average이라는 변수에 10으로 나눠서 저장되게끔 한다. 


-위에 calculate_sum(num)에서 배열의 이름을 매개변수로 전달하면 전달되는

매개변수의 값은 이 배열의 첫번째 칸의 주소이다. 

함수일때 함수의 매개변수를*array 이나 array[]받아도 똑같은 일이 일어난다.


포인터 arithmetic 위의 코드에서 이어서. 설명을 적을 것이다. 

*a와a[0]은 동일한 의미이다. 왜냐 배열의 이름 a가 가르키는건 배열의 첫번째 주소이기 때문이다. 

추가적으로 포인터 arithmetic은 뭐냐면 포인터에다가 연산을 한다는 의미이다. 

a[1] 은 *(a+1)과 동일하고 a[i]는 *(a+i)와 동일하다.

따라서 sum =sum + array[i]//*(array+i); 에서 array[i]와 *(array+i)는 같은 의미로 보면 된다.