본문 바로가기
C/기말고사 대비(2022 1학기)

[C언어] 포인터

by Meaning_ 2022. 5. 3.
728x90
반응형

&

변수의 메모리 주소를 구할 때는 &(주소 연산자)를 붙이면 된다.

포인터 변수 선언

출력값은 둘이 동일할 것

c언어에서 메모리 주소는 포인터 변수에 저장한다.

포인터 변수는 *를 사용하여 선언하는데

 

자료형 *포인터이름;

포인터 = &변수; 꼴이다. 

 

즉 numPtr은 10이 저장된 메모리의 공간, num1이 있는 공간을 가리킨다. 

 

그렇다면 역참조도 해보자.

*numPtr은 numPtr이 가리키는 값을 물어보는 것이다.

그럼 numPtr은 num1의 주소값이고 주소값이 가리키는 건 10이다. 그래서 10이 출력된다. 

정리하자면 역참조는 주소에 접근하여 값을 가져온다. 

이렇게 하면 둘다 20이 출력된다.

numPtr은 num1의 주소값을 가지고 있고

*numPtr은 num1을 가리키는데 num1의 값이였던 10을 20으로 바꿔버린다.

그러면 *numPtr=20이 되고 num1도 20으로 바뀌게 된다.

 

역참조 연산자는 값을 가져올 수도 있고 값을 저장할 수도 있다.

numPtr=num1은 에러가 뜬다.왜냐면 numPtr은 int 포인터 형인데 num1은 int형이라 자료형이 맞지 않는다.

 

 

void 포인터

자료형이 정해지지 않은 포인터를 void 포인터라고 한다. 

위 사진처럼 void포인터에 int,char 모두 다 저장할 수 있다.

반대로 다양한 자료형으로 된 포인터에도 void 포인터를 저장할 수 있다.

 

단 void 포인터는 자료형이 정해져있지 않기 때문에 역참조가 불가능하다.

 

int num1=1;

int *numPtr=&num1;

void *ptr;

ptr=numPtr;

 

printf("%d",*ptr); <-- 요런건 불가능하다. 

 

 

이중포인터

 

포인터의 포인터를 선언하는 방식이다. 

답은 10이 출력된다.

 

numPtr2가 가리키는 값은 numPtr1이고 numPtr1이 가리키는 값은 num1이다.

즉 10을 가리키는 것이다. 

 

무조건 기억해야하는 것

 

arr=&arr[0]

arr+i=&arr[i]

*(arr+i)=arr[i]

728x90
반응형

댓글