Languages/C

[C] Array와 포인터, 함수와 포인터

MOONCO 2022. 5. 12. 15:34

Array

똑같은 형식(타입)의 데이터들의 모음

배열의 이름은, 배열이 시작하는 주소를 가리키고 있으며
이는 상수이므로 한번 할당하면 바꿀 수 없다
( 포인터와 차이점 )

 

Array 만들기

#include <stdio.h>

void main(){
	int ia[10];
	// int타입의 10칸짜리 array를 만든다. ( 4바이트[1칸] * 10 의 메모리 공간 통째로 할당 ) 
	// array 메모리공간의  첫주소를, ia라는 변수에 저장한다. ( 포인터 )
}

 

메모리 주소는 1바이트 단위로 지정되어있으므로,

그 주소를 가리키는 포인터도, 1바이트 단위로 밖에 지정하지 못한다. ( 1비트 단위 주소는 없다 )

 

포인터

 메모리 주소를 저장하기 위한 변수

 

함수포인터

함수의 첫번째 주소를 저장하고 있는 변수

변수를 함수처럼 호출할 수 있다!

 

포인터의 증감

#include <stdio.h>

void main(){
    int ia[10];
    // 정수 10개를 가진 배열 생성 ( 4바이트 * 10 ), 첫번째 정수의 시작주소 저장
    
    int *ip;
    // ip라는 정수형 포인터 변수를 만든다. 
    
    ip = ia;
    // ip에 ia의 값을 저장한다. ( 배열의 첫번째 주소 )
    
    ip = 1;
    // ip가 가리키고 있는 주소에 1을 저장한다. ( 배열의 첫번째 주소 )
    
    printf("ia[0] = %d\n", ia[0]);
    /* 
      ia가 가리키고 있는 주소와, ip가 가리키고 있는 주소가 같으므로
      변화된 값이 출력된다.
    */ 
    
    ip++;
    /*
      ip가 가리키고 있는 주소에서부터, ip의 타입의 크기만큼 (int : 4bite) 뒤에있는 주소를 저장한다.
      ( ia[1]의 주소 )
    */
    
    printf("ia[1] = %d\n", ia[1]);
}
포인터값을 증감 시킨다는 것은,

메모리 주소값을 증감시키는 것이므로, 1바이트 단위로만 증감 할 수 있다.

( int 포인터의 증감 : 4바이트 단위로 증감 )

 

포인터 자체는 항상 4바이트 단위의 메모리를 할당받는다.

( 4GB 메모리 주소를 모두 나타내려면, 4바이트의 메모리 공간이 필요하므로! )

 

타입캐스팅

포인터에 저장할 주소의 값의 타입을 수동으로 지정해 주는 것

 

 

 

32비트, 64비트 컴퓨터?

cpu안의 메모리 (register) 크기에 따라, 다르게 부른다.
- 32비트 컴퓨터: 32비트 사이즈
- 64비트 컴퓨터: 64비트 사이즈

메모리 주소를 32비트로 표현하는 컴퓨터

cpu가 32bit 메모리를 가지고 있으면,
RAM메모리가 32비트 이상의 용량을 가지고 있어도, 32비트 이상의 메모리를 사용할 수 없다.

 

32bit

첫번째주소 0x00000000
마지막주소 0xffffffff

 

64bit

첫번째주소 0x00000000 00000000
마지막주소 0xffffffff ffffffff

 

 

 

 

반응형