C언어 - 포인터의 배열, 배열의 포인터

2023. 1. 5. 00:39·C프로그래밍/개인 공부

포인터의 배열

 

 

포인터의 배열이란, 배열의 원소안에 포인터들이 들어가는 배열이다.

int *ap[10]; //10개의 주소가 들어갈 수 있는 포인터 배열 선언

포인터 배열은 이렇게 선언한다.

 

 

 

포인터의 배열을 사용하면 문자열을 저장할 때, 장점이 있다.

예를 들어, computer라는 2차원배열을 선언하고 원소를 넣어보자.

char computer[3][8] = {
    "Mac",
    "Samsung",
    "Lenovo"
};

보통 이렇게 배열을 선언하고 초기화 할 것이다.

하지만, 이렇게 한다면 "Samsung"문자열은 8바이트를 다 사용하지만, Mac은 3바이트만 사용하게된다.

즉, "Mac"이란 문자열은 5바이트를 사용하지 않기때문에 메모리의 '낭비'가 생긴다.

 

 

 

그렇다면, 포인터의 배열을 사용하여 문자열을 저장해보자.

char *computer[3] = {
    "Mac",
    "Samsung",
    "Lenovo"
};

이렇게 선언하고 초기화하면, 각 열에는 문자열들을 가르키는 '포인터'만이 열에 들어간다.

메모리를 낭비하지 않을 수 있다.

 

형태

 

 

 


배열의 포인터

 

 

배열을 가르키는 포인터도 있다.

선언방법은, 

int(*pa)[10]; //10칸짜리 배열을 가르키는 배열 포인터

이렇게 선언하는데, 10칸짜리 배열을 가르키는 배열 포인터이다.

 

 

 

그림으로 보면 이렇다.

 

 

 

우리는 배열의 이름이 첫 번째 배열 원소의 포인터(주소)라는 것을 알고있다.

반면, 배열포인터는 배열 전체에 대한 포인터이다.

 

 

 

차이점을 보자.

1.  배열의 이름 사용 : 첫번째 배열 원소의 포인터.

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

p = arr; //배열의 첫번째 원소의 주소를 가르킨다.

*(p++);

*(p++) : p는 처음에 [0]을 가르킨다([0]의 주소를 예를들어 1000이라고 가정).

              *(p++)을 하면, 일단 p가 가르키고있는 주소에서 ++때문에 4바이트 증가시킨다.

              (1000을 가르키다가 1004를 가르킴).

              그렇다면 p는 ++때문에 현재 1004주소를 가르키고 1004는 2가 들어있음.

              즉, *(p++)는 2이다.

 

 

 

2. 배열포인터 사용 : 배열 자체를 가르킨다.

int arr[4] = {1, 2, 3, 4};
int (*p)[4];

p = &arr;

(*p)[2] = 3 이다.

(*p) : p가 가르키는 것. 즉, arr배열 자체를 가르킨다.

         그러면, 우리는 (*p)를 arr처럼 사용할 수 있다.

         (*p)[3]은 arr[3]과 같다.

 

 

 

'C프로그래밍 > 개인 공부' 카테고리의 다른 글

2차원 배열 포인터 형으로 함수 인자로 전달하기  (0) 2023.02.12
C언어 - 함수의 포인터  (0) 2023.01.07
C언어 - 이중 포인터  (0) 2023.01.03
C언어 - 연결리스트  (0) 2022.12.20
C언어 - 동적 메모리  (0) 2022.12.14
'C프로그래밍/개인 공부' 카테고리의 다른 글
  • 2차원 배열 포인터 형으로 함수 인자로 전달하기
  • C언어 - 함수의 포인터
  • C언어 - 이중 포인터
  • C언어 - 연결리스트
Jminu
Jminu
  • Jminu
    뇌 구조가 바이너리
    Jminu
  • 전체
    오늘
    어제
    • 분류 전체보기
      • C프로그래밍
        • 오류해결
        • 개인 공부
        • Programming Lab(학교수업)
        • MemoryTracker
      • C++
        • 개인 공부
      • 자료구조(Data Structure)
      • ARM arch
        • Cortex-M
      • 컴퓨터 공학(Computer Science)
        • OS
        • 컴퓨터 구조
      • Web
      • Linux
      • 똥글
      • 백준
      • Git 학습
        • 오류해결
        • 학습중
      • Python
        • 오류해결
        • 개인 공부
      • Qualcomm 기업과제
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    commit
    동적메모리
    ptrace
    yolo
    권머현
    rubik pi
    백준
    Qualcomm
    포인터
    C++
    Git
    rubikpi
    이진 트리
    과속탐지
    thumb2
    순환
    aapcs
    rubikpi3
    arm
    파이썬
    커널
    피보나치
    INIT
    파일 입출력
    소수
    자료구조
    스택
    c언어
    Branch
    버퍼
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Jminu
C언어 - 포인터의 배열, 배열의 포인터
상단으로

티스토리툴바