포인터를 가지고 수행할 수 있는 연산
대입하기 : 포인터에 주소를 대입할 수 있다. 예를 들면 대입값은 주소 연산자(&) 뒤에 오는 변수, 즉 배열이름이나 다른 제 2의 포인터가 될 수 있다. 단 그 주소는 포인터형과 일치해야 한다. 무분별한 데이터형 캐스트를 사용하지 않고서는, double형 값의 주소를 int형을 가리키는 포인터에 대입할 수 없다.
값 구하기 : *연산자는 그것이 참조하는 주소에 저장되어있는 값을 구한다.
포인터 주소 얻기 : 모든 변수들과 마찬가지로, 포인터 변수도 하나의 주소와 값을 가진다. &연산자는 포인터 자체가 어 디에 저장되어 있는지 알려준다.
포인터에 정수 더하기 : 포인터에 정수를 더하거나, 정수에 포인터를 더하기 위해 +연산자를 사용할 수 있다. 어느 경우 에나, 정수는 포인터가 가리키는 데이터형의 바이트 수만큼 곱해진다. 그러고 나서 결과가 최초 의 주소에 더해진다. 그 배열의 마지막 원소 바로 다음의 주소(past - the - end)가 유효하다고 보장하는 것을 제외하고, 덧셈의 결과가 최초의 포인터가 가리키는 배열의 범위를 벗어나는지는 정의되지 않는다.
포인터 증가시키기 : 배열의 한 원소를 가리키는 포인터를 증가시키면, 그 포인터가 배열의 다음 원소를 가리키게 된다. 그러므로, ptr1++는 ptr1의 값을 4만큼 증가시킨다.
포인터에서 정수 빼기 : 포인터에서 정수를 빼기위해 - 연산자를 사용할 수 있다. 포인터는 첫번째 피연산자이고 정수값 은 두번째 피연산자가 되어야 한다. 정수는 포인터가 가리키는 데이터형의 바이트 수만큼 곱해진다. 그러고 나서 최초의 주소에서 그 결과가 감해진다.
포인터 감소시키기 : 포인터를 감소시킬 수도 있다. ptr2를 감소시키면 배열의 세번째 원소가 아니라 두번째 원소를 가리키게 된다. 증가연산자와 감소연산자의 전위모드 후위모드 둘다 사용할 수 있다.
포인터 사이의 차 구하기 : 두 포인터 사이의 차를 구할 수 있다. 일반적으로, 같은 배열에 있는 원소들이 서로 얼마나 떨어져 있는지 알아내기 위해 같은 배열의 두원소를 가리키는 포인터들에 이 연산을 수행한다. 그 결과는 데이터형 크기와 같은 단위로 구해진다. int형 포인터 urn이 있을 때 &urn[2] - urn은 2이다. 두 포인터 차이가 2바이트가 아니라 2개의 int형 크기만큼 떨어져 있는 객체들을 가리킨다는 것을 의미한다.
포인터 비교하기 : 두 포인터가 같은 데이터형을 가리키는 경우에, 두 포인터 값을 비교하기 위해 관계연산자를 사용할 수 있다.
뺄셈은 두가지가 있다는 것에 주목하라, 한가지는 포인터에서 다른 포인터를 빼서 정수를 얻는 것이고, 다른 한가지는 포인터에서 정수를 빼서 포인터를 얻는 것이다.
C는, 어떤 배열이 주어졌을 때, 배열의 원소를 가리키는 포인터와 마지막 원소 바로 다음의 위치를 가리키는 포인터가 유효한 포인터라고 보장한다. 그러나 마지막 원소 바로 다음 위치를 가리키는 포인터가 유효하다고 보장은 하지만, 그 포인터가 가리키는 내용을 참조할 수 있다고 보장하지는 않는다.
포인터를 생성하면 포인터 자체를 저장하기 위한 메모리만 할당된다. 데이터를 저장하기 위한 메모리는 할당되지 않는다. 그러므로 포인터를 사용하기 전에, 반드시 이미할당된 메모리 위치를 그 포인터에 대입해야한다.
'Programming > C' 카테고리의 다른 글
프로그래밍 연습 6 (0) | 2019.05.12 |
---|---|
C언어 공부 16 (0) | 2019.05.11 |
C언어 공부 14 (0) | 2019.05.11 |
C언어 공부 13 (0) | 2019.05.11 |
프로그래밍 연습 5 (0) | 2019.05.09 |