본문 바로가기
깨알 c언어

깨알 c언어 ch.46 ~ 50

by moca7 2024. 3. 10.

46. 함수에 주소전달(6)

47. 함수에 주소전달(7)

48. 함수에 주소전달(8)

49. STATIC 변수(1)

50. STATIC 변수(2)

 

 

 

46. 함수에 주소전달(6)

 

ㅁ 문제

 

- func 함수

포인터변수 a는 main a의 주소값 100번지가 들어감.

변수 b는 20

포인터변수 c는 main 배열 c의 주소값 300번지가 들어감

 

x는 func의 포인터변수 a의 실제값이 들어감. 20.

100번지의 실제값이 20에서 20이 됨. 그리고 x는 21이 됨.

x는 20이 됨.

b는 21이 됨.

300번지의 실제값이 20에서 19가 됨.

함수종료. func의 a, b, c, x 다 사라짐.

 

- a=20, b=20, c=19

 

- --(*c)

괄호니까 먼저 처리. c의 값.

 

- return 0; 은 0을 리턴한다는 의미인데, main 함수에서 사용시 프로그램의 종료를 의미하게 됩니다

 

 

47. 함수에 주소전달(7)

 

ㅁ 문제

 

- func 함수

포인터변수 m에 100번지

포인터변수 x에 200번지

변수 y에 30

 

i=0, n=0

y는 10이 됨.

n은 3 + 6 = 9가 됨.         <-       잘 봐야됨. *(m+1)이랑 (*m + 2)는 다름. m에는 100번지가 있음. 이거의 값.

       3 + 3 = 6이 됨.

200번지 실제값인 10이 7이 됨. 

함수종료.

 

- a=7, b=30

 

 

48. 함수에 주소전달(8)

 

ㅁ 문제

 

- main 함수

변수 n 선언, 포인터변수 num 선언.

How many numbers? 출력

정수형 n의 주소값을 받음 <- 3 2 1 4 순서니까 여기선 3을 입력받겠다는 것.

num은 배열포인터. malloc. 그 공간만큼 할당을 했다. 3 받았으니까 3칸 할당.

포인터인데 배열이다.

num은 100번지라는 주소값을 갖고 있다. 

 

- a 함수

변수 n에 3 대입. 

포인터변수 num에 100번지가 들어감.

 

num 배열에 2 1 4가 들어감.

 

- b 함수

변수 n에 3 대입.

포인터변수 lt에 100번지가 들어감.

변수 a, b 선언.

 

1) a=0일 때, a<2는 참.

1-1) b=1, b<3은 참.

if ( lt[0] > lt[1] )     <-   2 >1 이니 

c( lt+a, lt+b )  <- ㄱ과 ㄴ 구하는건 큰 의미 없음.

 

c함수 호출.

포인터변수 a에 100번지, b에 101번지 들어감. 

그리고 100번지와 101번지의 실제값을 뒤바꿈. 

그럼 1 2 4가 됨.

 

1-2) b=2, b<3은 참.

if ( lt[0] > lt[2] )     <-   1 > 4 이니 거짓

 

1-3) b=3. b<3은 거짓. 반복문 종료.

 

2) a=1일 때, a<2는 참.

2-1) b=2, b<3은 참.

if ( lt[1] > lt[2] )   <-     2 > 4이니 거짓

 

2-2) b=3, b<3은 거짓. 반복문 종료.

 

3) a=2일 때, a<2는 거짓. 반복문 종료. 함수 종료.

 

- for (int i = 0; i < n; i++ )

      printf("%d ", num[i]);

 

출력. 1 2 4

 

 

49. STATIC 변수(1)

 

ㅁ 

- static 변수는 정적변수다. 공유하고 있는 변수다.

 

ㅁ static 변수

- 단 한번만 초기화 하고, 그 이후에는 전역변수처럼 프로그램이 종료될 때까지 메모리 공간에 존재하는 변수.

- 초기값이 지정 안되면 자동으로 0 대입.

(전역변수는 함수 위에 선언이 되어 모든 함수들이 공유하는 변수)

 

ㅁ 지역변수 사용

void test(){

int a = 10;

a++;

printf("%d", a);

}

void main(){

test();

test();

}

 

main함수에서 test함수를 호출함. 

출력결과 11 11

 

ㅁ static 변수 사용

void test(){

static int a = 10;

a++;

printf("%d", a);

}

void main(){

test();

test();

}

 

두번째 static 선언은 이미 있음. 메모리에 있으면 아무것도 안함. 10 대입 수행 안함. 

출력결과 11 12

 

ㅁ 문제

 

- static int count 2번째

이미 메모리에 있으므로 아무 일도 안함.

 

- 출력결과.

num=1, count=0

num=1, count=1

 

- 초기화는 대입의 한 방법이다. 

초기화는 변수나 요소를 생성하는 그 시점에서만 가능하다.

 

int a =3;           <- a는 변수의 선언과 동시에 초기화한다.

 

int b;   b=3;        <- b는 변수를 선언하고, 3을 대입한다. 

 

즉 선언과 동시에 대입하면 초기화하는 행위이다.

 

static 변수의 경우 꼭 한 번 초기화 해줘야 한다. 그리고 나선 대입이나 증감연산자를 통해 값을 바꾸더라도 초기화가 아니므로 값을 변경할 수 있다. 

 

 

50. STATIC 변수(2)

 

ㅁ 문제

 

1) i=0

2를 리턴. var1은 2가 되고 사라짐. var2는 2가 됨.

sum = 0 + 2 = 2

2) i=1

3을 리턴. var1은 2가 되고 사라짐. var2는 3이 됨.

sum = 2 + 3 = 5 

3) i=2

4를 리턴. var1은 2가 되고 사라짐. var2는 4가 됨.

sum = 5 + 4 = 9

4) i=3

거짓. 반복문 종료.

 

sum=9

 

'깨알 c언어' 카테고리의 다른 글

깨알 c언어 ch.56 ~ 60  (0) 2024.03.11
깨알 c언어 ch.51 ~ 55  (0) 2024.03.11
깨알 c언어 ch.41 ~ 45  (0) 2024.03.10
깨알 c언어 ch.36 ~ 40  (0) 2024.03.09
깨알 c언어 ch.31 ~ 35  (0) 2024.03.08