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)는 같은 의미로 보면 된다.
'프로그래밍 > 자료구조' 카테고리의 다른 글
자료구조 공부하기 추상 데이터 타입 (0) | 2016.12.30 |
---|---|
자료구조 공부하기 자료구조란? 알고리즘이란? (0) | 2016.12.30 |
동적 메모리 할당 (0) | 2016.12.30 |
문자열 (0) | 2016.12.30 |
문자열을 입력받아 문자열의 길이를 출력해보는 코드 (0) | 2016.12.30 |