-
20140325 (배열, 문자열)부산IT학원/스마트컨트롤러 2014. 3. 25. 17:35
27일차
--------------
Array ( 배열 )
--------------
어제에 이어 계속 배열을 배웠다.
바로 예제 소스를 보자.
ex) 예제 소스
#include <stdio.h>
int main()
{
int arr1[5] = {1,2,3,4,5};
int arr2[] = {1,2,3,4,5,6,7};
int arr3[15] = {1,2};
int ar1Len;
int ar2Len;
int ar3Len;
int iCnt;
printf("배열 arr1의 크기 : %d \n", sizeof(arr1) );
printf("배열 arr2의 크기 : %d \n", sizeof(arr2) );
printf("배열 arr3의 크기 : %d \n", sizeof(arr3) );
ar1Len = sizeof(arr1) / sizeof(int);
ar2Len = sizeof(arr2) / sizeof(int);
ar3Len = sizeof(arr3) / sizeof(int);
for(iCnt = 0; ar1Len > iCnt; ++iCnt)
{
printf("%d ", arr1[iCnt]);
}
printf("\n");
for(iCnt = 0; ar2Len > iCnt; ++iCnt)
{
printf("%d ", arr2[iCnt]);
}
printf("\n");
for(iCnt = 0; ar3Len > iCnt; ++iCnt)
{
printf("%d ", arr3[iCnt]);
}
printf("\n");
return 0;
}출력 화면
위에서 보았듯이
int arr1[5] = {1,2,3,4,5}; 선언시 {} 를 사용해서 초기화가 가능하고
int arr2[] = {1,2,3,4,5,6,7}; 변수 뒤에 []만 붙이면 몇 개나 들어가는지 자동으로 샌다.
int arr3[15] = {1,2}; 첫번째와 두번째만 넣고 나머지는 0으로 초기화.
- 배열은 잘 사용해야 하는게 다른 메모리를 침범이 가능하므로
잘 확인하고 사용해야 한다.
- cp == cStr ?????
#include <stdio.h>
int main()
{
char * cStr = "Good morning!";
char * cp1;
char * cp2;
cp1 = cStr;
printf("%c \n", *cp1);
printf("%s \n", cp1);
printf("%s \n", cStr);
// ++cp1;
cp1 = cp1 + 5;
printf("%s \n", cp1);
printf("%s \n", cStr+5);
cp2 = cStr;
printf("%c \n", cStr[0]);
printf("%c \n", cp2[0]);
printf("%c \n", *(cp2+0) );
printf("%c \n", *(cStr+0) );
return 0;
}출력 화면
이것을 통하여
cp == cStr
똑같이 주소값을 저장하고 있다.
조금 다른데
cp의 경우 주소값이 가리키는 값을 수정할 수 있는 반면
cStr의 경우 수정이 불가능하다.
const char * const cp == cStr 이게 정확한 똑같은 Data type이다.
- 문자열, 문자배열
무조건 문자가 모여있다고 문자열이라고 안한다.
마지막에 NULL이 없으면 printf함수 사용 시 NULL 만나기 전까지
출력하므로 계속 출력을 하게되므로 의도치 않은 상황이 발생할 수 있으니
위험하다.
- 주소상수
#include <stdio.h>
int main()
{
char str[] = "Hello world!\n";
char * cp = "Hello world!\n";
printf("str : 0x%08X \n", str);
printf("&cp : 0x%08X \n", &cp);
printf("cp : 0x%08X \n", cp);
printf("main : 0x%08X \n", main);
str[5] = '!';
cp[5] = '@';
printf(str);
printf(cp);
printf("Hello world!\n");
return 0;
}출력 화면
- 그리고 위에서 보면
cp[5] = '!'; 를 자세히 보면 cp포인터 변수가 가리키는 곳은 CODE 영역의 상수값이다.
윈도우에서는 실행이 되지만 리눅스에서는
이렇게 오류가 난다.
Windows 에서는 RO영역의 수정을 어느정도 허용하지만 (위험함)
linux 에서는 RO영역의 수정을 금지한다.
'부산IT학원 > 스마트컨트롤러' 카테고리의 다른 글
20140327 (포인터, 배열, call by address, call by value) (0) 2014.03.27 20140326 (배열) (0) 2014.03.26 20140324 (전역변수, 메모리 구조, 재귀함수) (0) 2014.03.24 20140321 (함수, 지역변수) (0) 2014.03.21 20140320 (포인터, Hexa View, 함수) (0) 2014.03.20