포인터
포인터란 주소값의 저장을 목적으로 선언된다.
자료형 *포인터변수명;
으로 선언된다.
포인터의 자료형은 메모리공간을 참조하는(=접근하는) 기준이 된다.
즉 int형의 포인터인경우 4바이트만 접근 가능하다.
포인터는 주소값을 저장하기 때문에 &연산자로 얻어온 주소값을 저장하거나,
배열의 시작주소(=배열명) 을 저장하여 접근 가능하다.
*(p+2): p번지+2
*p+2 : p번지의 내용에 +2
괄호의 사용에 주의한다.
ex)
void main(){
int arr[3]={1,2,3};
int *p = arr;
for( int i=0; i<3; i++){
printf("%d, ", *(p+i)); //p+i가 가리키는 값 즉 arr[i]와 같다.
}
}
포인터는 함수의 인자로 받는것도 가능하다.
값을 전달하는 형태의 함수호출을 call by value라고 하며
주소를 전달하는 형태의 함수호출을 call by reference라고 한다.
ex)
void main()
{
char a;
int b;
float c;
InputData(&a,&b,&c);//call by reference
OutputData(a,b,c);//call by value
}
void InputData(char *p1, int *p2, float *p3)
{
scanf("%c", p1);
scanf("%d", p2);
scanf("%f", p3);
}
void OutputData(char n1, int n2, float n3)//call by value방식 반환
{
printf("%c, %d, %f", n1, n2, n3);
}
void OutputData(char *p_n1, int *p_n2, float *p_n3)// call by reference 방식 반환
{
printf("%c, %d, %f", n1, n2, n3);
}
/////////////////////////////////////////////////////////////////////////////////////////////////
이중 포인터
int temp=30;
int *p = &temp;//포인터 p에 temp 주소값 저장
int **p2 = &p;//pp p2에 p의 주소값 저장
printf("%d, %d\n", &p, p2); //p의주소, p2의 값 출력
printf("%d,%d,%d\n", &temp, p, *p2);
printf("%d, %d, %d\n", temp, *p, **p2);
**p2 = 100;
printf("%d,%d,%d\n", temp, *p, **p2);