Acdong
Learn by doing
Acdong
전체 방문자
오늘
어제
  • 분류 전체보기
    • Economy
      • Saving Money
    • Self-improvement
    • Thoughts
    • Machine learning
      • Deep Learning
      • Chatbot
      • NLP
    • MLops
      • AWS
      • Container
      • Serving
    • Computer Vision
    • Data Science
      • ADsP
      • R
    • Project
    • Python
      • Data Structure & Algorithm
    • C,C++
    • API
      • ElasticSearch
    • Error Note
    • Network
    • RDBMS
      • SQL

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • [GitHub]

인기 글

태그

  • 이미지 전처리
  • pandas
  • 회귀계수
  • R
  • 존댓말 반말 분류
  • sbert
  • 어텐션
  • SentenceTransformer
  • plot()
  • Numpy
  • nlp
  • R그래프
  • 머신러닝
  • Python
  • 데이터 전처리
  • 포인터
  • c포인터
  • 기계학습
  • 다중공선성
  • R시각화

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Acdong

Learn by doing

[C,C++] 배열과 포인터
C,C++

[C,C++] 배열과 포인터

2019. 2. 28. 20:43
728x90

배열과 포인터

 

 

 

1. 첨자 연산

 

배열의 내부적 처리 :

 

배열은 정보를 저장하는 가장 기본적인 자료 구조로서 실용성이 높다. 포인터는 조금 어렵기는 하지만 C언어를 다른 언어와 구분하는

가장 큰 특징이다. 이 둘은 아주 긴밀한 연관을 맺고 있으며 상호 보완적이면서 또한 일정 부분에 있어서는 대체도 가능하다.

배열의 정보저장 능력과 포인터의 정보 가공 능력이 결합되면 복잡한 현실 문제들을 해결하는데 아주 강력한 무기가 된다.

 

- C는 내부적으로 1차원 배열만 지원한다. 2차원 이상의 다차원 배열은 1차원 배열의 확장에 불과하다. C에는 2차원 배열이라는 것이 없다.

But 배열끼리 중첩이 가능하기 때문에 외부적으로는 다차원 배열도 지원하는 셈이다.

 

- 배열을 구성하는 배열 요소의 타입에는 전혀 제한이 없다. T형 변수를 선언할 수 있으면 T형 배열도 언제나 선언할 수 있다. 배열도

유도형 타입의 일종이며 따라서 배열 그 자체가 배열의 요소가 될 수 있다.


포인터 배열 :

 

포인터 배열이란 요소가 포인터형인 배열이다. T형이 있을 때 T형 포인터를 선언할 수 있고 T형 배열도 선언할 수 있으므로 T형 포인터 배열도 선언할 수 있다.

 

ex )

Int *arpi[5];

 

description )

* 가 앞쪽에 있으므로 arpi는 먼저 정수형 포인터가 되고 다음으로 []에 의해 그런 포인터 변수 5개를 모아 배열을 선언하게된다.

정수형 변수나 정수형 배열을 가리킬 수 있다.


포인터와 배열 총정리 :

 

선언문 1

int i; // 정수형 변수를 i라는 이름으로 선언 4byte 할당


선언문 2

int ar[n];

int ar[n]; // 정수형 변수 n개를 모아 놓은 정수형 배열 n이 5라고 할때 sizeof(ar)은 20이 된다.

 

int *pi;

int *pi; // 정수형 변수 하나의 위치를 가리킬 수 있는 포인터 , 메모리는 항상 4byte , &i 같은 정수형 변수의 주소값을 대입 받는다.


선언문 3

pi=(int *)malloc(n*sizeof(int));

pi=(int *)malloc(n*sizeof(int)); // 동적 메모리할당

ar 과 똑같은 자격을 가지며 정수형 배열처럼 행세할 수 있다.

위에 선언문처럼 포인터를 배열과 거의 비슷하게 사용할 수 있다. 배열과 포인터는 완전히 같다고 할 수 있는가하면

그렇지 않고 차이점도 많이 있다.


차이점

1. 포인터는 변수인데 , 배열은 상수이다.

- pi는 고유의 메모리를 차지하고 있고 언제든지 다른 대상을 가리킬 수 있지만 ar은 선언할 때 그 위치가 이미

고정 되어 있다.

 

2. pi가 가리키는 배열의 크기는 동적으로 결정할 수있지만 ar이 가리키는 배열의 크기는 선언할 때 정적으로 결정된다.

- 가변의 배열이 필요하면 int * 형 포인터 변수를 선언한 후 malloc으로 할당해서 사용해야한다.

 

3. 배열은 그 자체가 크기 때문에 함수의 인수로 전달할 수 없지만 포인터는 대상체가 무엇이든간에 4byte의 크기 밖에 차지하지 않음으로 함수로 전달할 수 있다.

 

4. 배열로 요소를 읽는 것과 포인터로 대상체를 읽는 동작은 속도차이가 있다.

- 대략 포인터가 배열보다 두 배 정도 빠르다.


선언문 4

 

int *api[5];

api 배열을 위해 할당되는 메모리는 20바이트밖에 안 되지만 각 요소는 int * 형이므로 동적으로 할당된 번지를 api의

각 요소에 대입하면 api는 정수형 배열을 가리키는 포인터의 배열이 될 수 있다.

 

int **papi;

papi의 요소인 papi[n]은 int * 타입으로서 정수형 배열을 가리킬 수 있는 포인터이다. 이런 포인터 변수 여러 개를 모으면 포인터 배열이 되고 그런 배열을 가리키는 포인터를 선언하면 바로 papi가 된다. 그래서 papi는 포인터-배열-포인터가 되며 api 같은 포인터 배열을 가리킬 수 있다.

 

int **apapi[3];

 

정수형 변수의 집합인 배열을 가리킬 수 있는 포인터의 집합인 배열을 가리키는 포인터의 집합인 배열이다.

ㅅㅂ??

 

 

 

 

 

반응형

'C,C++' 카테고리의 다른 글

[C++]객체지향 프로그래밍 _ 함수(1)  (0) 2019.05.20
[C#] Class 클래스 사용_Random 과 List  (0) 2019.04.11
[C,C++] 이중 포인터  (0) 2019.02.25
[C,C++] 포인터 동적 메모리 할당  (0) 2019.02.25
[C,C++] 포인터 연산  (0) 2019.02.25
    'C,C++' 카테고리의 다른 글
    • [C++]객체지향 프로그래밍 _ 함수(1)
    • [C#] Class 클래스 사용_Random 과 List
    • [C,C++] 이중 포인터
    • [C,C++] 포인터 동적 메모리 할당
    Acdong
    Acdong
    E-mail : alswhddh@naver.com / 자연어처리와 MLops 를 연구하고 있는 스타트업 개발자입니다.

    티스토리툴바