참고자료
1. 포인터
- 컴퓨터의 메모리는 데이터를 보관하는 장소
- 바이트 (8 bits) 단위로 주소가 지정됨
-
모든 변수는 주소를 가짐
- 포인터는 메모리 주소를 값으로 가지는 변수이다. 포인터 변수는 다음과 같이 선언된다.
type-name * variable-name;
- variable-name은 선언된 포인터 변수의 이름이며, *는 variable-name이 포인터 변수임을 표시하고, type-name은 포인터 변수 variable-name에 저장될 주소에 저장될 데이터의 유형을 지정한다.
int * ptr; // 정수형 포인터 변수 ptr 선언
- 연산자 &는 변수로부터 그 변수의 주소를 추출하는 연산자이다.
int c = 12;
int *p;
p = &c;
변수명 앞에 등장하면 포인터 변수는 하나의 기호로서 쓰여진다. 하지만 아래의 일반적인 연산에서 포인터 변수가 앞에 등장하면. 그 포인터 변수가 저장하고 있는 주소, 그 주소에 저장된 값이나 자리를 의미하게 된다.
int x=1, y=2;
int * ip;
ip - &x;
y = *ip; // ip라는 포인터 변수가 값으로 가지고 있는 주소에 저장된 값
*ip = 0; //
2. 포인터와 배열
- 포인터와 배열은 매우 긴밀히 연관되어 있다
- int a[10];
- 배열의 이름은 배열의 시작 주소를 저장하는 포인터 변수이다. (단 그 값을 변경할 수 없음)
#include <stdio.h>
#include <string.h>
int calculate_sum(int *array);
int main(){
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 calcaulate_sum(int * array)
{
int sum , i;
sum = 0;
for ( i=0; i<10; i++)
sum = sum + *(array + i);
return sum;
}
int calcaulate_sum(int array[])
{
int sum , i;
sum = 0;
for ( i=0; i<10; i++)
sum = sum + array[i];
return sum;
}
포인터 arithmetic
- *a와 a[0]은 동일한 의미이다.
- 또한 a[1]은 *(a+1)과 동일하고, a[i]는 *(a+i)와 동일하다
int data[] = {1,2,3};
int *p = &data[0];
printf("%d \n",p);
//변수 p의 값 즉 배열 데이터의 첫번째 메모리 주소값
printf("%d \n",p+1);
//위에 나온 값에 +4가 되어 나옴 정수형 포인터변수이기 때문에