상수 포인터 int * const p



int * const p

포인터 자체가 상수화 된다.

주소는 변경이 불가능하고, 가리키는 곳의 값은 역참조로 변경이 가능

 



 상수 지시 포인터 const int *p



포인터가 지시하는 곳의 값을 상수화 시킨다

주소는 변경이 가능하지만, 가리키는 곳의 값은 역참조로 변경이 안된다.

char *name = "홍길동"

*name='a'; 오류

 



 상수 지시 상수 포인터 const int * const p



포인터 변수와 가리키는 곳은 상수화

주소와 가리키는 곳 모두 변경이 불가능

 



 포인터 상수 ( 배열포인터 )  int arr[5]



배열 포인터라고도 부르며 상수 포인터와 비슷한 의미

배열명만 포인터 상수라 부른다

 일반 포인터의 경우 4바이트에 메모리를 가지지만

배열의 경우 메모리를 가지고 있지 않고,

찾아가기 위해 존재하는 상징적인 포인터

arr = &num <= 에러존재



 배열명의 의미



포인터 상수이기 때문에 l-value에 위치 불가능

일반 포인터와 다르게 메모리 공간을 따로 미할당

배열의 첫번째 요소의 주소를 상직적으로 표현

l-value에 위치하지만 않으면 일반포인터의 모든 연산 수행 가능

배열포인터라 불림

배열로 선언된 지역의 메모리 공간을 대표하는 상징 (모배열)

 



 포인터 배열과 배열 포인터



포인터 배열
각각의 요소가 포인터로 이루어진 배열

int *arr[5]

배열 포인터

int형 타입이 5개로 이루어진 배열을 지시하는 포인터

int (*arr)[5]

 



 문자열



문자열? NULL(숫자 0, '\0') 으로 끝나는 char 타입의 데이터 집합

문자배열 : char name[5]={'a','b','c','d','e'}

| 'a' | 'b' | 'c' | 'd' | 'e' | 

문자열 : char name[5]="abcde"

| 'a' | 'b' | 'c' | 'd' | 'e' | '\0' |

위 같은 경우 문자열은 끝에 NULL('\0') 문자가 삽입

 



 문자열 상수와 문자열



문자열 상수인 char *name = "abcd" 인 경우

name이라는 이름을 가진 하나의 포인터가 "abcd"라는 문자열 상수를 가리키게 된다

따라서 상수를 참조하게 되므로 문자열 수정이 불가능

문자열인 char name[5]="abcd"인 경우

메모리를 직접 할당한 문자열. 즉, 배열참조형식 이므로 문자열수정이 가능 

 



 문자열 함수



strlen : NULL을 제외한 길이를 구하는 함수 

원형 : size_t strlen( const char *str )

 - str에서 NULL을 제외한 길이를 구하는 함수 


strcpy : 문자열 복사 함수 

원형 : char *strcpy( char* dest , const char *src )

 - dest에 src를 복사하는 함수


strcat : 문자열 결합 함수

원형 : char *strcat( char* dest , const char *src )

 - dest와 src를 결합하는 함수


strcmp 

원형 : int strcmp( const char *dest, const char *src )

 - dest와 src를 비교


이외에 여러가지지가 있으나 위에 4가지가 많이 쓰인다. 

 



 포인터 배열과 배열 포인터의 차이를 알고 포인터를 상수화하는 방법을 알아보았다

 포인터 배열 말 그대로 포인터로 이루어진 배열이고 배열 포인터는 배열을 가리키는 포인터

 상수 지시 포인터와 상수 포인터를 정확히 알고 쓰자!! 

출처 : soen.kr / 학원



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

배열  (0) 2016.03.25
표준함수  (0) 2016.03.19
기억부류  (0) 2016.03.19
함수와 프로시저  (0) 2016.03.18
연산자  (0) 2016.03.14

 배열의 정의



배열은 동일한 타입을 가지는 변수들의 유한 집합
- 배열의 기본형식
- type 배열명[크기][크기]....;
- 배열명은 배열의 이름이고 [] 괄호 사이에 있는 값은 몇 개의 단위가 묶여서 구성하는지 지정하며 자연수로된 상수만 적어야 한다.

 



 배열의 특징


  1. 배열의 요소의 번호인 첨자는 항상 0부터 시작한다(Zero Base)
    - 컴퓨터의 첫번째 시작은 항상 0이다.
    - int a[5]; 라고 선언된 배열의 시작은 0~4 ( n-1 )의 번호이다.

  2. 배열의 총 메모리 양은 배열의 크기에 배열의 요소의 크기를 곱해서 구할 수 있다
    - sizeof(타입) * 정수(크기, 갯수)
        예시> int a[5]; => sizeof(int) * 5 => 4byte * 5 => 20byte
    - 배열의 크기 = sizeof(배열) / sizeof(배열[0])
        예시> sizeof(int a[5])/sizeof(a[0]) => 20byte / 4byte => 5개

  3. 배열을 선언 시 크기값은 반드시 상수 이어야 한다.
    - 배열의 생성 시는 상수를 입력해 주어야 하지만,
      생성 이후에는 i라는 int형 변수값을 첨자로 사용할 수 있다.

  4. 배열의 범위를 점검하지 않는다.
    - int ar[5]; 로 정해져 있는 경우 int a[8]; 이면 컴파일은 되지만 정상적인 실행은 되질 않는다.
        그렇기 때문에 보통은 반복문을 이용해서 배열의 범위만큼만 루프를 돌도록 해주면 배열의 범위를 벗어나지 않는다.
    - for (i=0;i<5;i++)
      {
        if( i>=0 && i< 5)
       {
            x += a[i];
       }
    }
     


 다차원 배열



2차원 배열은 [] 첨자 두 개를 사용하는 배열이고 차원이 늘어날 수록 [] 첨자 연산자가 늘어날 수록 차원이 높아진다.


int apple[3][6]; 
정수형 변수 6개가 3개의 묶음으로 생성 된다. 생성되는 배열 요소는 6 * 3 = 18개를 apple 이라는 배열명으로 선언한 것.

Apple[0][0]

Apple[0][1]

Apple[0][2]

Apple[0][3]

Apple[0][4]

Apple[1][0]

Apple[1][1]

Apple[1][2]

Apple[1][3]

Apple[1][4]

Apple[2][0]

Apple[2][1]

Apple[2][2]

Apple[2][3]

Apple[2][4]


이 배열이 메모리상에 생성된 모양을 그려보면 위와 같다. 하지만 메모리는 선형적인 구조이기 때문에 이해를 돕기위해 위와 같이 그려서 관리할 뿐 실제로는 일직선으로 연결 되어 있다. 


배열명은 단독으로 사용되는 배열의 시작번지값을 가지는 포인터 상수이다.

즉, 배열명만 쓰면 배열의 시작번지를 가리키는 포인터 값이 된다.

 



 배열 초기화



배열은 여러 변수들의 집합이며 정수형 변수나 실수형 변수와 자격은 동일하며 변수에 적용되는 규칙이 배열에서 똑같이 적용된다.
배열의 부류 지정자도 일반 변수와 동일하며 효과 또한 동일하다. 

int apple[5]; 와 같이 초기화를 하지 않을 경우 쓰레기 값이 들어가게 된다. 


type 배열명[크기]={초기화값들};


int apple[5] = {4,8,3,69,-7};

위와 같이 선언과 동시에 초기화를 메모리를 할당 받음과 동시에 초기화 값들로 메모리를 채운다.

초기식 int number[1000] = {1,2,3,0,0,............... }

즉 비어 있는 초기화의 경우 995개가 다 0으로 채워진다


배열 크기와 초기값이

결과

꼭 맞으면

만사형통 / int a[2][2]={1,2,3,4};

초기값이 모자라면

나머지는 0
int a[2][3]={{1,3},{4,5,}};

초기값이 남으면

에러로 처리
int a[2][3]={{1,2,3},{4,5,}};

배열크기를 생략하면

개수만큼 자동으로 크기 설정
int a[][2]={{1,2},{3,4},{5,6}};



 



 배열의 활용



불규칙한 정보를 담아 그걸 표현하는 형태로 활용이 가능하고 난수로 생성한 좌표를 배열에 저장해 놓고 필요할 떄 사용할 수 도 있다.
작업 결과를 저장하는 데에도 사용하게 된다. 

 


 


 배열은 동일한 타입의 유한한 집합

 다차원 배열을 사용할 수 있으며 int a[2][3]의 경우 정수용 변수 3개의 묶음이 2개가 있는 것이라고 볼 수 있다.

 

출처 : soen.kr



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

배열과 포인터 그리고 문자열  (0) 2016.04.19
표준함수  (0) 2016.03.19
기억부류  (0) 2016.03.19
함수와 프로시저  (0) 2016.03.18
연산자  (0) 2016.03.14

메모리 구조

  • CODE(TEXT) SEGMENT
  • HEAP SEGMENT ( L -> H )
  • FREE SEGMENT
  • STACK SEGMENT (H->L) 후입선출
  • DATA SEGMENT ( L -> H )

- Initialized Data Segment

- BSS(Block Started by Symbol)

(전역(extern), 정적변수 0으로 자동 초기화)

위와 같은 변수들은 초기화를 안할 경우에 문제가 생길 수 있기 때문에 존재한다.

High Address

Low Address

 

코드(텍스트) 영역 ( Code(Text) Segment )

  • 코드 자체를 구성하는 메모리 영역

 

  • Hex 파일이나 Bin 파일 메모리

 

  • 프로그램 명령이 위치하는 곳으로 기계어로 제어되는 메모리 영역

 

  • " 문자열 상수를 제외한 지역변수에 할당 "되는 리터럴 상수가 기계어로 저장

 

  • 알고가자!!!
    문자열 상수( "홍길동" ) => Data Seg\Rom 영역
    선언된 지역에 따라 메모리 영역이 다르다.

 

데이터 영역 ( Data Segment )

  • 전역변수와 정적(static) 변수 중 초기화가 할당된 변수가 저장되는 영역

 

  • 변수는 RAM에 저장( Read & Write )

 

  • 변수에 대입하는 초기값은 ROM에 저장

 

  • ROM에 저장된 변수 생성시 복사하여 변수에 할당

 

  • 할당하는 초기값 중 문자열 상수를 제외한 리터럴 상수는 컴파일러에 따라 코드영역에서 복사는 경우도 있다.

 

  • 데이터 영역 - BSS< Block Started by Symbol >
    전역변수 또는 정적 변수 중 초기값이 할당되지 않은 변수가 저장되는 영역

 

  • 메모리를 생성하지 않고 상징적인 변수의 이미지(상징)만 존재

 

  • 프로그램 시작 시 BSS에 저장된 변수들은 0으로 초기 값을 대입

 

  • Data영역으로 이동 / 메모리는 RAM에 할당. 즉, 상징적으로만 존재하는 영역

 

힙 영역 ( Heap Segment )

  • 런타임에 할당하는 동적 메모리가 위치하는 영역

 

  • 크기는 정형화 되어 있지 않고 유동적이고 Free 영역에 가변적으로 크기를 확장

 

  • 동적 할당한 메모리는 식별자(명칭)가 존재하지 않으므로 포인터 변수를 사용해서 접근가능

 

  • 메모리는 낮은 주소에 높은 주소로 할당

 

  • 메모리가 부족할 경우 할당이 실패하여 NULL을 반환

 

  • 런타임에 BSS와 HEAP 사이를 기준 으로 HEAP은 아래로 순차적으로 메모리를 사용한다

 

  • 포인터 변수는 각 지역의 특성에 영향을 받아 생성하고 참조하는 메모리가 HEAP에 존재

 

자유 영역 ( Free Segment )

  • 힙영역과 스택영역의 완충지 역할

 

  • 두 영역이 유동적 일 수 있는 것은 자유영역에 해당 영역의 크기 확장할 수 있다.

 

  • 스택 영역이 Free 영역을 침범해서 Heap 영역을 침범할 경우 StackOverFlow

 

  • 반대의 경우에 Heap 은 NULL 을 리턴

 

스택 영역 ( Stack Segment )

  • 프로그램이 실행 시 자동으로 사용하는 임시 메모리 영역

 

  • 크기는 정형화 되어 있지 않고 유동적이며 Free 영역에서 가변적으로 크기 확장이 가능

 

  • 기본적으로 약 1MB의 크기로 할당

 

  • 지역 변수, 매개 변수, 리턴 값 등 잠시 사용 후 사라지는 유형의 데이터가 저장 되는 영역

 

  • 메모리는 높은 주소에서 낮은 주소로 할당 되며 메모리 부족 시 StackOverFlow 발생

 

메모리 구조는 6가지로 구분된다.
CODE, DATA, BSS, HEAP, FREE, STACK

출처 :

'프로그래밍 > 프로그래밍 기초' 카테고리의 다른 글

바인딩과 바인딩 타임 그리고 할당  (0) 2016.04.21
메모리 관리기법  (0) 2016.03.21

+ Recent posts