&
변수의 메모리 주소를 구할 때는 &(주소 연산자)를 붙이면 된다.
포인터 변수 선언
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]
'C > 기말고사 대비(2022 1학기)' 카테고리의 다른 글
[기말고사 기출문제 풀이] 2016년 기말(가) (0) | 2022.06.08 |
---|---|
[C언어 시험대비] 정규표현식 (0) | 2022.06.06 |
[c언어 시험대비] static과 재귀 (0) | 2022.06.06 |
[C언어/기말] 포인터를 사용하는 이유 (0) | 2022.05.17 |
22/05/09 포인터 스터디 정리 (0) | 2022.05.09 |
댓글