본문으로 바로가기

[C언어] 포인터 (정리4)

category C언어 2018. 2. 7. 19:26


포인터 개념


  • 포인터 변수
▷ 주소값을 저장하는 변수, 주소값에 해당하는 영역을 가리키면서 간접적으로 값을 읽어오거나 변경시킬 수 있다.

  • 차원조절 연산자
*, [], &, (type), ->


1차원 포인터


1
2
3
char a = '#';
char *p;
= &a;
cs
  • line 2 : 변수 p를 문자형 포인터 변수로 선언
  • line 3 : 이제 변수 p는 a의 주소를 갖는다.
  • ch)  p => 100, &p => 200, *p =>'#',  a => '#', &a => 100
  • 모든 포인터 변수는 동일한 크기(size)를 갖는다. 
    • (운영체제의 bit가 아닌 컴파일러의 bit에 따라 포인터 변수 크기는 다르다.)
    • 32bit로 컴파일할 때, 4바이트로 모두 같다.
    • 64bit로 컴파일할 때, 8바이트로 모두 같다.
** 주소 연산 규칙

  • (주소상수 + n) => (주소상수 + n * 주소상수가 의미하는 기억공간의 크기) 번지
  • 주소상수끼리의 연산은 덧셈 뺄셈만 가능
  • 주소에 해당하는 기억공간간의 index차이로 계산

  • 포인터 변수 p의 경우, p + i의 값은 p + i*sizeof(*p)번지인 것을 활용한다.
  • 9 line : ary[i] == *(ary+i) == *(ptr+i) == ptr[i] 인 것을 이해하자!

** 주의 사항

  • case 1
    • 11 line : Read only data영역이다.
    • 12 line : R.T.E (Read only data 영역에 write하려 했기 때문에)
  • case 2 
    • 21 line : stack영역에 잡한 예약영역이기 때문에 write 가능
** 포인터와 연산자

 *ptr++

 ① *ptr의 값을 구하고 ② ptr을 1 증가시킨다

 (*ptr)++

 ① *ptr의 값을 구하고 ② *ptr을 1 증가시킨다

 *++ptr

 ①  ptr의 1 증가시킨 후 ② *ptr를 구한다

 ++*ptr

 ① *ptr의 1 증가시킨 후 ② ptr을 1 증가시킨다


▷ ++, * : 포인터 우선 순위는 같으므로 <- 순으로 해석한다. (단항연산자의 결합방식은 <-이므로)



다차원 포인터


1
2
3
4
5
6
7
8
int num = 0;
int *p1;
int **p2;
int ***p3;
 
p1 = &num;
p2 = &p1;
p3 = &p2;
cs


▷ 대입식을 통해 Lvalue와 Rvalue의 차원을 맞춰 사용 가능하다.



** 다차원배열의 포인터 표현


1
2
3
a[i] == *(a+i)
a[i][j] == *(*(a+i) + j)
a[i][j][k] == *(*(*(a+i) + j) + k)
cs



함수 포인터


  • 함수포인터 : 함수를 가르키는 포인터
    • 함수명은 각각 자신의 시작주소 상수이다.
    • 함수의 type (*함수포인터명) (함수전달인자);


  • 8 line : 함수포인터 선언
  • 9 line : 함수포인터로 함수를 가르킨다. (함수명은 시작주소 상수이므로)


'C언어' 카테고리의 다른 글

[C언어] 구조체 (정리5)  (0) 2018.02.09
[C언어] 배열 (정리3)  (0) 2018.02.06
[C언어] 데이터형 (정리2)  (0) 2018.02.06
[C언어] Preview (정리1)  (0) 2018.02.02

댓글을 달아 주세요