-
20140326 (배열)부산IT학원/스마트컨트롤러 2014. 3. 26. 17:35
28일차
----------------
Array ( 배 열 )
----------------
- 배열 초기화
char caString[256] = "";
char caString[256] = {0};
둘다 0(NULL)로 초기화 된다.
- Call by Address, Call by Value
이것은 함수에 인수를 다룰 때 쓰는 방법이다.
Call by Address : 주소를 넘겨 호출.
Call by Value : 값을 넘겨 호출.
ex) 예제 소스
#include <stdio.h>
void CallByValue(int, int);
void CallByAddress(int *, int *);
int main()
{
int iNum1 = 10;
int iNum2 = 100;
CallByValue(iNum1, iNum2); // Call By Value
printf("CallByValue() -> %d %d \n", iNum1, iNum2);
CallByAddress(&iNum1, &iNum2); // Call By Address
printf("CallByAddress() -> %d %d \n", iNum1, iNum2);
return 0;
}
void CallByValue(int n1, int n2)
{
int iTemp;
iTemp = n1;
n1 = n2;
n2 = iTemp;
}
void CallByAddress(int * n1, int * n2)
{
int iTemp;
iTemp = *n1;
*n1 = *n2;
*n2 = iTemp;
}출력 화면
CallByValue 는 말 그대로 main에 있는 변수의 값만
가져와 쓰기 때문에 CallByValue 에서 무슨 짓을 해도
main의 변수에 접근할 수 없다.
CallByAddress 는 말 그대로 main에 있는 변수의 주소값을
가져와 쓰기 때문에 CallByAddress 에서 무슨 짓이든
main의 변수에 접근할 수 있다.
- 여기서 잠깐 무시무시한 scanf()의 무서움을 보자.
ex) 예제 소스
#include <stdio.h>
int main()
{
char cStr[8];
printf("문자열 입력 : ");
scanf("%s", cStr);
printf("입력 받은 문자열 : %s \n", cStr);
return 0;
}출력 화면
여기까지는 별 문제 없어 보인다.
하지만
입력한 문자가 9개를 넘어가면서 오류가 발생한다.
위에서 cStr[8] 크기를 8byte로만 지정했기 때문에
9byte (9글자)를 받았을때에 오류가 난다.
지금까지 scanf("%d", &iNum); 이렇게 항상 변수 앞에 &를 붙였는데
포인터를 배우면서 보았듯이 주소값을 넘겨주기 때문에
scanf() 함수에서 main함수의 변수를 만질 수 있었다.
그래서 그 이상의 값이 들어왔을때 오류가 나는 것을 볼 수 있다.
상위 버전 컴파일러로 컴파일시 scanf 함수 사용만으로도 warning을 출력한다고 한다.
그러니 지금은 scanf() 함수를 쓰지만 나중에 안정성을 위해
다른 함수를 사용해야할 것이다.
'부산IT학원 > 스마트컨트롤러' 카테고리의 다른 글
20140328 (const, 2차원배열) (0) 2014.03.28 20140327 (포인터, 배열, call by address, call by value) (0) 2014.03.27 20140325 (배열, 문자열) (0) 2014.03.25 20140324 (전역변수, 메모리 구조, 재귀함수) (0) 2014.03.24 20140321 (함수, 지역변수) (0) 2014.03.21