포인터(2)

이지우·2022년 10월 12일
0

C언어

목록 보기
9/17

포인터 사용시 주의점

  1. 초기화가 되지 않은 포인터의 값에 접근 X
    -> 포인터 변수가 아무것도 가리키고 있지 않다고 표시하기 위해서는 null로 초기화 해야한다.
int *p;
*p = 10;	// 주소값이 쓰레기값으로 들어있음 -> 어디를 가리키고 있는 것인지 모름
  1. 포인터 변수와 가리킬 변수의 형식이 같아야한다.
    -> double형 변수를 int형 포인터로 가리키면 값이 손실됨!
    -> 반대로 int형 변수를 double형 포인터로 가리키면 초기화되지 않은 공간까지 가리키게됨

포인터 연산 (주소 연산)

증감 연산자

포인터가 가리키는 변수의 자료형에 따라 ++(증가 연산) 한 결과가 다르게 나타난다.

포인터 자료형증가되는 값
char1
short2
int4
float4
double8

-> 자료형의 변수 크기와 같은 크기가 증가된다.

--(감소 연산) 결과도 마찬가지로 변수 크기만큼 변화한다.


연산자 우선순위 주의

*p++;

연산자 우선순위로 인해 p가 가리키는 위치의 값을 가져온 뒤 p의 값(주소)을 증가시킨다.

(*p)++;

p가 가리키는 위치의 값을 가져와 증가시킨다.

후위 연산자( a++ )가 전위 연산자( ++a )보다 우선순위가 높음

수식의미
v = *p++p가 가리키는 값을 v에 대입한 후에 p를 증가한다.
v = (*p)++p가 가리키는 값을 v에 대입한 후에 가리키는 값을 증가한다.
v = *++pp를 증가시킨 후에 p가 가리키는 값을 v에 대입한다.
v = ++*pp가 가리키는 값을 가져온 후에 그 값을 증가하여 v에 대입한다.

포인터와 배열

포인터는 배열처럼 사용 가능하다.

배열의 이름은 배열 시작 주소를 가리킨다.

int n[10];
int *p = n; // p가 배열 시작 주소를 가리킴

n[5] = 8	// 배열 n의 시작 위치의 주소에서 5만큼 떨어진 주소에 8 저장
n + 5;		// n = 배열 시작 주소 -> n + 5 == &n[5]
*(n + 5) = 8;	// n[5]에 8 저장
p = p + 7;		// p가 시작 주소였으므로 p + 7 == &n[7]
*p = 99;		// n[7]에 99 저장

이때 p = a; 라고 하면 p[0], p[1] 같이 포인터를 배열처럼 사용할 수도 있다.

-> 함수 매개변수로 배열을 사용하는 것과 배열을 가리키는 포인터를 사용하는 것은 같다.
but, 포인터 사용이 인덱스 사용보다 빠르다.

int n[10];
int i;
int *p;

for(i = 0; i < 10; i++)
	*(n + i) =  i * 3;	// 배열의 이름 n을 주소처럼 사용 가능
    					// 배열 n을 3의 배수로 채움
p = n;					// 포인터 p에 배열 n의 시작 주소 설정

for(i = 0; i < 10; i++)
	printf("%d ", *(p + i));	// 포인터 p를 이용하여 n의 원소에 접근
printf("\n");    

for(i = 0; i < 10; i++){
	*p = *p + 2;		// 포인터 p를 이용하여 배열 원소 값 2 증가
    p++;				// 다음 원소 주소로 이동
}

for(i = 0; i < 10; i++)
	printf("%d", n[i]);			// 인덱스를 이용하여 원소에 접근
printf("\n");
profile
노력형 인간

0개의 댓글