int main(void)
{
int i;
for(i=0; i<5; i++)
fct();
return 0;
}
void fct(void)
{
int val=0; //static int val=0;
val++;
printf("%d ",val);
}
실행결과
1
1
1
1
1
-------------------------------------------------------------
void fct(void);
int main(void)
{
int i;
for(i=0; i<5; i++)
fct();
return 0;
}
void fct(void)
{
static int val=0;
val++;
printf("%d ",val);
}
실행결과
1
2
3
4
5
14. 재귀함수 를 사용하는 이유 - 자료구조, 알고리즘 문제해결을 위해서
15. 매크로 함수 정의시 앞뒤로 () 반드시 표시해줄것
#define cal ((3*4)+(12/4))
16. 구조체 typedef
typedef struct Data{
int data1;
int data2;
} Data;
struct Data data
17. int array[10] : int형 데이타를 10개 저장할수 있는 메모리 공간을 할당하고 이름을 array 로 붙여줘라.
배열초기화
int arr1[5]={1, 2, 3, 4, 5};
int arr2[ ]={1, 3, 5, 7, 9};
int arr3[5]={1, 2}
18. 문자열 상수, 변수
- 문자열 상수 : printf("Hello World! \n"); 문자열 상수는 메모리의 주소값을 반환한다.
- 문자열 변수 : char str1[5] = "Good"; 문자열은 문자열의 끝을 표현하기위해 null 문자를 끝에 지닌다. [G],[o],[o],[d],[null]
19. 포인터
& 연산자 : 변수의 주소값반환
* 연산자 : 포인터가 가리키는 메모리 참조
int main(void)
{
int n = 7;
int *pN = &n;
printf("%d",n); // 7 - 직접접근
printf("%d", *pN); // 7 - 간접접근
}
20. * 연산자
- 곱하기
- 포인터 선언
- 포인터가 가리키는 메모리 참조
21. 포인터에 타입이 존재하는 이유 : 포인터 타입은 참조할 메모리의 크기 정보를 제공
포인터 = 주소값 + 자료형
22. 잘못된 포인터의 사용
int main(void)
{
int *pA; // pA는 쓰레기 값으로 초기화 됨
*pA=10;
return 0;
}
int main(void){
int* pA=100; // 100이 어딘 줄 알고???
*pA=10;
return 0;
}
23. 배열과 포인터
–배열 이름은 첫 번째 요소의 주소 값을 나타낸다.
int main(void)
{
int a[5]={0, 1, 2, 3, 4};
int b=10;
a=&b; //a는 상수이므로 오류, a가 변수였다면 OK!
}
24. 포인터 연산
–포인터가 가리키는 대상의 자료형에 따라서 증가 및 감소되는 값이 차이를 지님
int main(void)
{
int* ptr1=0; // int* ptr1=NULL; 과 같은 문장
char* ptr2=0; // char* ptr2=NULL; 과 같은 문장
double* ptr3=0; // double* ptr3=NULL; 과 같은 문장
printf("%d 번지, %d 번지, %d 번지 \n", ptr1++, ptr2++, ptr3++); //0,0,0
printf("%d 번지, %d 번지, %d 번지 \n", ptr1, ptr2, ptr3); //4,1,8
return 0;
}
25 . 배열과 포인터
26. 문자열 표현 방식
배열기반의 문자열 변수 : char str1[5] = "abcd";
포인터 기반의 문자열 상수 : char* str2 = "ABCD";
27. 배열의 함수 인자 전달 방식
- 배열이름(포인터)에 의한 전달 (call by ref)
int main(void)
{
int arr1[2]={1, 2};
fct(arr1); //배열의 주소값을 던진다.
printf("%d \n", arr1[0]); //3이 출력된다.
return 0;
}
void fct(int *arr2) //주소값을 받기 위해 포인터로 받는다.
{
printf("%d \n", arr2[0]); // *(arr2 + 0) 와 같음
arr2[0]=3; // *(arr2 + 0) 와 같음
}
28. "int * pArr" vs. "int pArr[ ]"
- 둘다 같은 의미를 지닌다.
- 선언 "int pArr[ ]"은 함수의 매개 변수 선언 시에만 사용 가능
int function(int pArr[]) {} == int function(int *pArr){}
29. const 키워드를 사용하는 이유 : 컴파일시 잘못된 연산에 대한 에러 메시지를 보여주기 위해서
30. 2차원 배열 int arr[3][4] : 3 = 세로, 4 = 가로
31. 스트림 :파일, 콘솔, 소켓 의 데이타를 송.수신 하기위한 일종의 다리
32. -> pMan 이라는 포인터가 가리키는 대상의 멤버에 접근하라
struct person
{
char name[20];
char phone[20];
}
int main()
{
struct person man = {"Thomas","000-000-0000"};
struct person * pMan;
pMan = &man;
//구조체 포인터를 이용한 출력
printf("name : %s\n", pMan->name);
printf("phone : %s\n", pMan->phone);
return 0;
}