C의 자료형의 표현[java와 비교]
자바의 자료형
정수 |
실수 |
참거짓 |
Byte(1), short(2) int(4) long(8) Char(2)à 음수표현불가
|
Float(4), double(8)
|
Boolean(1) |
참조 자료형 : 객체, 배열, Enum, Annotation , |
C자료형
정수 |
실수 |
참거짓 |
Char(1)à음수표현가능, short(2), int(4), Long(4) **unsigned형태의 4개가 더 존재 |
Float(4), double(8)
|
없음. 단 모든 비트가 0=false 모든비트가 0이 아니면 =true 하지만 대체로 1을 사용함 |
응용 자료형: 배열(구조체- class 유사), 함수, 포인터(주소값), 나열형(enum), 공용체(union) |
주소값의 type은 unsigned int (stack에 쌓이는 주소값…)
Char ch1 = ‘a’;
Char ch2 = ‘b’;
와 같이 선언한 경우 아래와 같이 스택에 쌓이게 된다.
|
|
|
b |
a |
100
101
102
103ßch2
104ßch1
그러나 byte 를 잡을 때는 컴파일러에 따라 조금식 다름.. char는 1 바이트지만 4byte씩 잡아서 1byte만 쓰고 나머니 3byte를 버리는 방식…(VS 윈도우 컴파일러 )
주소값을 찍어내게 되면
Printf(“%d\n”, sizeof(‘a’)); 실제는 1byte지만 찍어내는 순간 4byte씩 잡힌다.
배열?
- 같은 데이터 타입, 여러 개 선언
- Index로 접근 (음수인덱스가 가능)
Int a ; //4byte
Int b[5]// 20byte
Int c[5] = {1,2,3,4,5};
초기화할 때는 ={} 중괄호로… 변수 선언과 동시에 초기화 가능(자바와 동일)
배열명 = 주소 (배열의 5칸으로 선언하면 5칸의 할당됨)
주소값은 4byte 씩… 배열의 인덱스는 0~5까지만이지만 인덱스의 앞뒤로 값은 메모리에 존재하기 때문에
접근하는 것 자체는 가능하다 의미있는 값이 들어가 있지는 않음
번지수(주소) |
100 |
104 |
108 |
112 |
116 |
120 |
|
|
|
|
1 |
2 |
3 |
4 |
5 |
|
|
인덱스 |
|
0 |
1 |
2 |
3 |
4 |
|
|
주소값출력시 |
|
&c[0], &c |
&c[1] |
&c[2] |
&c[3] |
&c[4] |
|
|
예) &c[0],&c은 다르다.
&C+1 = 120 (+1은 대표값을 더해준다는 의미임=포인터연산)
C의 값은 100 C의 대표값은 20(sizeof) 이므로 120
&C[0] +1 = 104가 나옴 (위와 같은 이유로)
int c[5] = {1,2,3,4,5};
printf("%d\n", &c+1);
printf("%d\n", &c[0]+1);
6422320 <--- 출력값 &c의 값인 6422300 + 20(배열 c의 사이즈)
6422304 <---- 배열 첫번째 방의 값인 6422300+ 4( 배열 한칸의 사이즈 4)
* 주소값은 본래 unsigned 부호값이 없음