int a = 30;

int *pnum;

pnum = &a;

int와 같은 포인터의 형은 메모리 공간을 참조하는 기준이 된다.

int라면 지정된 주소를 시작으로 4바이트를 읽어들이면 되고, double일 경우 8바이트를 읽는다.

 

* 포인터 변수는 선언하고 초기화를 꼭 해야한다.

int *ptr = 0;
int *ptr2 = NULL;

0 과 NULL은 아무 곳도 가르키지 않음을 뜻한다.

 

배열의 이름은 배열의 시작 주소 값을 의미한다. 그 형태는 값의 저장이 불가능한 상수이다. (주소 값 변경 불가능)

 

포인터를 배열의 이름처럼 사용할 수 있다.

int arr[3] = {1,2,3};

int *ptr = &arr[0];

ptr[0] == arr[0]

ptr[1] == arr[1]

*(ptr+i) == arr[i]

int형 포인터에 1을 더하면 주소 값 4 증가

int *ptr = 0x0010;
ptr1 = ptr + 1;

ptr1 == 0x0014

 

변수 형태의 문자열 : str은 그 자체로 abc중 a가 저장된 위치를 가르킨다.

char str[] = " abc"

상수 형태의 문자열 : 문자열 변경 불가 

str2는 "abc" 문자열이 저장된 주소를 가르키므로 가르키는 주소가 바뀔 수 있다.

char *str2 = "abc"

str2에는 주소 값이 저장된다. 사실상 printf 함수에서도 문자열 전체가 아닌 주소 값을 전달받는다. 

 

함수의 매개변수를 포인터 변수로 선언한다면 배열을 통째로 넘겨 받을 수 있다. (원래는 배열통째로 못 넘겨줌)

 

void su(int *param)
{
	for(i=0;i<3;i++)
    {
		print(param[i]);
    }
}

int main(void)
{
	int arr[3]={1,2,3};
    su(arr)
}

 

+ Recent posts