20140325 (배열, 문자열)
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영역의 수정을 금지한다.