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
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • C프로그래밍
        • 오류해결
        • 개인 공부
        • Programming Lab(학교수업)
        • MemoryTracker
      • C++
        • 개인 공부
      • 자료구조(Data Structure)
      • ARM arch N
        • Cortex-M N
      • 컴퓨터 공학(Computer Science)
        • OS
        • 컴퓨터 구조
      • Web
      • Linux
      • 똥글
      • 백준
      • Git 학습
        • 오류해결
        • 학습중
      • Python
        • 오류해결
        • 개인 공부
      • Qualcomm 기업과제
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바