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
반응형