크기(size)와 해석(inerpretation)이 존재
크기는 bit수 => long, long long, unsigned...
해석은 data type => char, int, float...
C언어 data type
char = 1바이트 = 8비트 = 256
int = 4바이트 = 32비트 = 4,294,967,296
signed = 부등호 표현
unsigend = 부등표현하지 않는 타입
java data type
유니코드를 포함한 char이기 때문에 C언어보다 높은 비트수를 가집니다.
아스키코드
포인터란?
메모리 상에 위치한 특정한 데이터의 (시작)주소값을 보관하는 변수
int p = 123 // 123 저장
int 123이 메모리 주소에 저장된 상태
메모리주소의 시작점 = 0x152839
int* p // p의 메모리시작주소를 가리킴
포인터 p 에 들어 있는 값 : 0x7fff894c8b3c
int 변수 a 가 저장된 주소 : 0x7fff894c8b3c
포인터의 장점
메모리 주소를 참조하여 배열과 같은 연속된 데이터에 접근과 조작 용이
동적 할당된 메모리 영역(힙 영역)에 접근과 조작 용이
한 함수에서 다른 함수로 배열이나 문자열을 편리하게 보낼 수 있음
복잡한 자료구조를 효율적으로 처리
메모리 공간을 효율적 사용
call by reference에 의한 전역 변수의 사용을 억제
포인터의 단점
포인터 변수는 주소를 직접적으로 컨트롤하기 때문에 예외 처리가 확실하지 않을 경우 예상치 못한 문제가 많이 발생. ( 널 포인트 같은 경우에 바로 접근할 경우 예외 발생)
선언만 하고 초기화를 하지않을 경우 쓰레기 주소를 가리키고 있기 때문에 사용에 주의해야 함.
포인터 변수는 주소를 직접 참조하기 때문에 의도하지않게 원본의 값이 수정 될 수 있다.
오류를 범하기 쉽고 기교적인 프로그램이 되기 쉽다.
프로그램의 이해와 버그 찾기가 어렵다.
메모리 절대 번지 접근 시 시스템 오류를 초래한다.
배열이란?
컴퓨터 메모리 상에 같은 타입의 변수를 연속적으로 여러 개를 한 꺼번에 정의할 수 있는 방법을 제공하고 있는데 이를 바로 배열(Array) 이라고 합니다.
ex) int형 자료 10개의 원소를 가지고 있는 배열
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
arr[3] = 4
arr[10] = ???
문자열
"abc" = {'a','b','c'} + null 4바이트 사용
2차원배열 형태
1차원배열형태
int arr [10] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}
2차원 배열형태
int arr[10][2] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}
int arr[10][2] = {
{0,1},
{2,3},
{4,5},
{6,7},
{8,9},
{10,11},
{12,13},
{14,15},
{16,17},
{18,19}
}
각 원소는 원소의 주소인 기저주소로부터 얼마나 떨어져있는지를 나타내는 오프셋으로 지정할 수 있다.
int arr[3] = 4
만약 char[3] = 25777 를 담는 다면?
17 => 00010001
8비트 => 00000001
17 and 8비트 => 00010001 AND 00000111 => 00000001
1이 하나
1개수만큼 왼쪽시프트 => 00000010 => 2
2번째에 위치한다!
d