36. 배열포인터
37. 함수
38. 함수와 반복문
39. 함수에 주소전달(1)
40. 함수와 변수의 유효범위
36. 배열포인터
ㅁ 22년 1월 25일 기준, 배열포인터는 딱 1문제 출제되었음. 나온다면 극강의 난이도.
ㅁ 배열포인터
- 포인터인데 배열이다. 근데 자기가 가지고 있는 개수로 다시 잘라서 재조합 함.
- 배열의 시작 주소값을 저장할 수 있는 포인터 2차원 배열의 구조
- 하나의 포인터다.
ㅁ
- int (*in)[2];
배열포인터를 선언할땐 이런식으로 선언. in이라는 포인터를 만들건데 2개씩 자른다.
그리고 2차원행렬 형태로 만들어버림.
- 2차원 배열은 행 대표주소가 있음. 0행의 행 대표주소는 100번지다.
- in의 값은 0행의 대표주소를 가리키고 있다.
ㅁ
- **( in+1 )
in이 가리키고 있는 공간은 in[0]
in이 가리키고 있는 공간의 다음 공간은 in[1]
in[1]의 값의 값은 5
ㅁ 문제
- #define N 3
매크로. 앞으로 나오는 N은 전부 3으로 대체하겠다.
- malloc 함수
동적으로 메모리에다 할당하는 거. 변수 선언할 때 크기를 정해준다.
- out이라는 포인터 변수 만들어놨고, sum에다가 0 넣어놈.
- 그리고 in에다가 (malloc 앞부분) 어떤 배열을 선언할건데, (malloc 뒷부분) 3 * 3 즉, 3행 3열짜리 배열을 만들겠다는 것.
근데 그걸 in에다 집어 넣겠다. in은 3열씩 짜르는데. size of는 신경 안써도 된다.
- 그리고 out에다가 배열포인터 in의 값을 넘겨준다. 그럼 in과 out이 똑같은 구조를 갖게 된다.
- out의 0번지에 0들어가고, 1들어가고, 2들어가고 ...
- 답은 0+4+8=12
37. 함수
ㅁ 함수
- 반복적인 수행을 정의해 놓은 작은 프로그램 단위
ㅁ 함수 구조
반환타입 함수명(인자들...) {
수행할 작업1
수행할 작업2
}
- 반환타입은 int로 반환할거냐 char로 반환할거냐 그런거.
- 반환타입이 int라면 {}안에 return 해가지고 정수값이 들어가게 됨.
- void는 반환타입이 없음. 반환을 하지 않아도 되는 함수.
ㅁ 함수의 선언과 사용
int sum(int a, int b)
{
int c = a + b;
return c;
}
int data = sum(10, 20); <- 함수 sum내의 작업들이 일어나고 여기서 선언됐던 변수들은 폐기가 됨.
printf("%d", data);
- 함수의 사용은 int data라는 공간을 만들어 놓고 sum 함수를 호출함.
- 출력결과 30
ㅁ 문제
- swap(k, j);
k에 있는 3이라는 값과 j의 2라는 값을 가지고 swap함수로 제어권이 넘어감.
- 넘어가면 a는 3, b는 2가 선언됨.
그리고 a는 2가 되고, b는 3이 되고, temp는 3이 됨.
그리고 아무일도 일어나지 않음. 이러고 끝남. 그리고 끝나면 이 함수에서 사용됐던 것들 중
static이나 전역변수인거 빼고는 다 폐기시킴. 싹 폐기됨. a, b, temp 다.
(함수가 종료될 때 메모리에 있는 변수만 사라지게 됨. 만약 print가 있었다면 이미 출력한건 사라지지 않음.)
- 답은 k = 3, j = 2
Q. void 타입에서 반환할 필요가 없다면 모든 void 함수는 무시해도 되는가?
A. 리턴값이 없는 void 형 같은 경우에는 안에서 어떤 일들이 일어나는지만 확인해주시면 됩니다.
주소값을 넘겨서 해당 주소값의 값들을 변경 시킬수가 있기 때문에, 그 안에 있는 내용들은 확인해주셔야 합니다.
Q. k와 j의 값을 바꾸려면 함수 swap이 어떻게 바뀌어야 하는가?
int main(void){
int k, j;
k=3;
j=2;
swap(&k, &j);
printf("k=%d, j=%d", k, j);
}
void swap(int *a, int *b) {
int temp;
temp = *a;
*a = *b;
*b = temp;
}
- k와 j의 주소값이 포인터변수 a와 b에 들어간다. 100번지, 200번지가.
포인터 변수 a의 주소값이 k의 주소값과 같아지는거.
a의 메모리상 주소값은 300번지. a에는 100번지가 들어감.
b의 메모리상 주소값은 400번지. b에는 200번지가 들어감.
temp는 500번지. *a니까 100번지의 실제 값이 대입됨.
100 200 300 400 500
k j a b temp
3 2 100 200 3
100번지에 있는 실제값이 2가되고, 200번지에 있는 실제값이 3이 됨.
- 함수가 종료되면 *a, *b, temp 다 사라짐.
- 주소값을 참조하느냐 안하느냐에 따라 달라짐.
값만 넘기면 데이터 결합도, 주소를 넘기면 스탬프 결합도이다.
ㅁ 배열 문제
- printF( arr[2] );
주소값이 아닌 3이라는 값을 함수에 넘겼다.
- 출력결과. 203
- 함수로 넘어가면 a의 메모리상 주소값은 700번지. a에는 100번지가 들어감.
- 출력결과. 2020
- 함수 인자에 배열 형태 a[]말고 포인터 형태 *a여도 된다.
38. 함수와 반복문
ㅁ 문제 - 다음 c프로그램 출력값은?
- int i, tmp, curent =1, last = 0;
이거 i, tmp, curent 다 1이 되는게 아니고, i랑 tmp는 그냥 선언만 한거고 curent만 1 대입함.
- 함수가 종료되면 n, i, tmp, curent, last 다 사라짐. static이나 전역변수 빼곤 다 사라짐.
- 답은 5
39. 함수에 주소전달(1)
ㅁ
- 함수에 주소를 전달하겠다는건 포인터를 전달하는 것. 포인터 혹은 배열
- 값을 전달하는게 있고 주소를 전달하는게 있음.
- call by value: 함수를 호출할 때, 값을 가지고 호출하겠다.
- call by reference: 함수를 호출할 때, 주소값, 객체, 오브젝트, 배열 등을 전달하겠다.
ㅁ 문제
- x 주소는 100번지 값은 10
- 포인터변수 i 주소는 300번지 값은 100번지
- i의 실제값 10에 5를 더함. x도 15가 됨.
- return( 2 **i + ++j )
2 곱하기 *i 더하기 ++j
2 x 15 + 21
return은 51
- 출력결과
51 15 20 ( %d하고 공백있음)
40. 함수와 변수의 유효범위
ㅁ
- 중요한건 변수의 유효범위
- 함수에서 변수를 참조할 때, (자바도 마찬가지) 나랑 가장 가까이 있는 변수를 참조한다.
ㅁ 문제
- int a=1, b=2, c=3;
전역변수 선언
-
전역변수(Global variable) : 어느 위치에서든 호출하면 사용이 가능
(함수 밖에 선언하여 클래스 전체에서 사용이 가능한 변수)
지역변수(Local variable) : 특정구역({ }) 내에서 생성되어 그 구역에서만 사용
(함수 속에 선언되어 해당 함수 속에서만 사용이 가능한 변수)
- main함수 위에 int f(void);
별 의미 없음. 메인 함수 밑에 이 함수가 있다는걸 알려주는 것.
- 인자가 void면 어떤 입력도 받지 않는다는 것.
void func(void){};
이런 함수는 입력도 반환도 하지 않는 것.
- %3d
3개의 공간을 만들고 오른쪽부터 출력하라
- int b, c;
전역변수에 a, b, c가 선언되어 있음에도 지역변수로 또 b, c를 선언.
어떻게 되는가.
전역변수 a, b, c 그대로 있고 그 함수 안에 b, c가 또 있음.
함수 안에 선언되는 변수들의 이름은 중복해서 사용할 수 없다.
그러나 다른 함수 안에 선언된 지역변수들은 이름이 중복되도 된다.
지역변수와 전역변수가 겹칠 경우에는? 전역변수와 지역변수 이름이 중복되도 된다.
- a=b=c=4;
4라는 최종적인 값을 c에도 대입하고 b에도 대입하고 a에도 대입하라.
a에다가 b를 대입하고 그다음... 순서(왼쪽->오른쪽)가 아니라 4부터 왼쪽으로 순서.
그런데 전역변수 a=1, b=2, c=3가 있고 지역변수 b, c가 있는 상황.
같은 이름의 지역변수와 전역변수가 동시에 정의되어 있다면 지역변수가 우선한다.
전역변수 a=4, b=2, c=3이 있고, 지역변수는 b=4, c=4가 된다.
- return(a+b+c);
전역변수랑 지역변수가 겹침. 지역변수가 우선한다. 지역변수가 없으면 전역변수를 쓴다.
고로 4+4+4= 12를 반환한다.
- 함수가 종료되고 지역변수 b, c는 사라진다. 전역변수는 그대로 있다.
- 출력결과
12
4 2 3
ㅁ
- 어떤 함수를 호출할 때 보내주는 값이 인자고, 함수에서 그 인자를 받고 선언되는 것이 매개변수다.
'깨알 c언어' 카테고리의 다른 글
깨알 c언어 ch.46 ~ 50 (0) | 2024.03.10 |
---|---|
깨알 c언어 ch.41 ~ 45 (0) | 2024.03.10 |
깨알 c언어 ch.31 ~ 35 (0) | 2024.03.08 |
깨알 c언어 ch.26 ~ 30 (0) | 2024.03.08 |
깨알 c언어 ch.21 ~ 25 (0) | 2024.02.22 |