Home C언어 공부 정리(6/10)-포인터 맛보기
Post
Cancel

C언어 공부 정리(6/10)-포인터 맛보기

22/01/06

1. 포인터 연산자

&(주소 연산자)

  • 단항연산자
  • 변수의 주소값을 리턴
  • ex)

    1
    2
    3
    
    int x = 3;
    printf("%d, ", &x); // 변수의 주소 출력
    printf("%d", x); // 변수의 값 출력
    
  • 결과 : 주소값, 3

※ 배열의 이름은 주소값을 나타낸다!

1
2
3
int arr[5] = {1,2,3,4,5};

printf("%d", arr);

결과 : 주소값

&단순변수 = 변수명

*(참조 연산자)

  • 포인터
  • 주소를 가리키고 있다.
  • 사용법

    1
    2
    3
    4
    
    // 단순변수
    int x = 1;
    int *p; // 포인터 선언
    p = &x; // x의 주소를 가리킴
    

    pointer01

    1
    2
    3
    
    // 배열
    int y[5] = {1,2,3,4,5};
    int *q = y; // 배열명 자체가 주소이기 때문에 '&'연산자 없이 사용 가능
    

    pointer02

2. 포인터와 배열

  • 포인터가 배열을 가리킬 시 배열 전체를 가리킴
  • 배열 내부의 값(index) 가리키기
    pointer&arr
  • q[0] = q+0 = y+0 = y[0] = 1
  • q[3] = q+3 = y+3 = y[3] = 4

포인터 index, 배열 index

1
2
3
4
5
int y[10];
printf("%d", y[11]); // error!

int *p = y;
printf("%d", p[11]); // ok
  • 배열의 index
    • 초기화시 배열의 크기가 정해짐
    • 크기는 변하지 않음
    • 배열 크기보다 큰 index 지정시 오류발생
  • 포인터의 index
    • 포인터는 메모리 전체배열로 봄
    • 포인터가 가리키는 배열의 index를 초과하면 그 다음 주소를 가리킨다.

포인터의 배열 설정

1
2
3
4
int a[10];
int *q;

q = &a[3]; // q의 index 설정


배열a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]
포인터q-3q-2q-1qq+1q+2q+3q+4q+5q+6
  • 포인터 index 설정에 따라 배열의 index와는 다를 수 있다.

3. 형의 합성

  • 기본
    1. int *p;
    2. int **p;
    3. int *p[3];
    4. int (*p)[3];
    5. int *p[3][4];
    6. int (*p)[3][4];

type01

  • 우선 증가 나선 법칙
    • ‘변수명 >> 오른쪽 >> 왼쪽 >> 오른쪽’ 순으로 해석하는 법칙
    • 만약 괄호()가 있다면 괄호를 먼저 본다.
      우선_증가_나선_법칙
    1. int *func(void);
    2. int (*p)(void);
    3. int (*func(void))[3];
    4. int (*p[3])(void);

type02

4. 함수의 배열 값 리턴

  • 단순변수인 경우 함수에서 리턴할 때 값이 그대로 리턴됨
  • 배열인 경우 함수에서 리턴할 때 값이 들어오지 않음
    • 함수가 끝나면 함수안의 모든 자료들이 사라지기 때문
    • 배열명은 이 아닌 주소
  • malloc(크기) : 메모리 공간을 확보하는 함수
    • 함수의 자료를 메모리에 저장해 리턴될 수 있게 해준다.
  • 사용법
    • *변수 = (데이터타입 *)malloc(크기);
  • 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <stdlib.h> // for malloc()

char *func();

int main() {
    char *p;
    p = func();
}

char *func() {
    char *x;
    x = (char *)malloc(5); // 메모리 5개 할당

    return x;
}

5. 같은 리턴, 요소 함수 포인터로 가리키기

1
2
3
4
5
6
7
8
9
10
float add(float, float);
float mul(float, float);
float sub(float, float);
float mol(float, float);

int main() {
    float (*p)(float, float); // float func(float, float) 함수 가리킴

    p = add; // add함수를 가리킴
}
This post is licensed under CC BY 4.0 by the author.

C언어 공부 정리(6/10)-매크로

C언어 공부 정리(7/10)-포인터

Comments powered by Disqus.