임베디드 개발(before)/IoT 임베디드 SW 개발자 양성과정

[3일차] C언어 교육3-(함수, 베열포인터, 문자열함수, 전역변수)

주운녕 2020. 7. 15. 22:48

오늘 강의 시작은 강사님의 당부의 말로 시작되었다.

"너무 한 번에 다 알려고 조급해하지 마세요~ 나중에 다 이해 가능합니다. 다만 주의사항! 손으로 직접 해봐야 합니다! 단순히 따라 하는 것이 아닌 안 보고 코드를 직접 짜 봐야 합니다! 만고불변의 법칙은 손가락이 기억한다는 것입니다!"

 

뭔가 대충 나가는 듯하면서도 궁금했던 점이나 헷갈렷던 점들은 잘 짚어주신다.

 

1. 포인터 기호 " * " : '간접참조연산자' 라고한다.

2. 다시 한번! 포인터는 주소를 저장하는 변수일뿐입니다!

3. 32bit 머신에서 주소 값은 모두 4byte이다!! 따라서 char*, int*, double* 포인터의 크기 모두 4byte이다! '주소 값'이기 때문에.

4. 포인터의 장점 - 매개변수를 통해 주소로 변수에 접근하기 때문에 지역변수의 단점을 극복할 수 있다.

-교재의 고급 편 들어감 (배열과 포인터)-

5. VS code 설치.! git과 연동 가능, 여러 가지 작업환경이 좋음! 컴파일과 실행 가능! 유용한 단축키 다양! but 설치로 한 2~3시간은 잡아먹음.. 그동안 알고리즘 문제 품

6.

정수연산  pa + 1 두번째 배열요소의 주소
간접참조 연산 *(pa+1) 두번째 배열요소
배열요소 표현식 pa[1] 두번째 배열요소

7. &ary[0] == ary    //  그럼 &ary는?? -> 배열 전체를 하나의 변수로써 그 변수의 주소를 의미라는데 솔직히 잘 안 와닿음. 배열 요소 전체를 가리키는 포인터??

8. 배열과 포인터, 함수 실습. N을 입력하고 N만큼 숫자를 입력하면 최댓값을 출력하는 프로그램.

#include <stdio.h>

void savearray(double *arr);
double whatismax(double *pa);

int main(void){
	double arr[100];
	double MAX;

	printf("size와 size개수 만큼 수를 입력하면 가장 큰 값을 알려드립니다.\n");
	savearray(arr);
	MAX = whatismax(arr);
	printf("가장 큰 값은 %.3f입니다.\n", MAX); //배열 이름은 = 주소

}

void savearray(double *arr){
	int length;

	scanf("%d", &length);
	for(int i=0; i<length; i++){
	scanf("%lf", arr+i);
	}
}

double whatismax(double *pa){
	double max;

	max = *(pa);
	for(int j=0; j<5; j++){
		if(*(pa+j)>max)	max = *(pa+j);
	}
	return max;
}

9. ". text" 영역은 코드가 들어가는 Read Only 영역이다. 문자열 또한 바뀌지 않는 영역 (const) 이기 때문에 text 영역에 들어가 있다.

그렇답니다.

10. 문자열 연산 함수 'Strcpy' 에 대해 배움. char 형으로 선언된 문자열은 문자 개수를 셀 때 마지막 NULL 문자를 포함해서 세어라!

11. char str[80] = "apple" 일 경우

       sizeof(str) == 80 //배열 전체 크기 계산

       strlen(str) == 5 //문자 개수 (NULL은 제외한.)

 

- 변수 사용 영역 - 여기부터 책을 제대로 읽어보자 (고급형부터 진짜 고수 스킬들이 나온다.)-

12. 전역 변수와 지역변수의 장단점에 대하여..

  장점 단점
전역변수 접근이 쉽다. 
코드도 작아지고, 속도도 빨라진다.
지역변수 장점의 반대..
- 타 프로그램에 함수 재사용시 전역변수 긁어 와야함.
- 디버그 어렵고
- 계속 메모리 차지
지역변수 1. 함수의 모듈화에 최적!
 - 함수의 독립성을 높인다.

2. 디버깅의 효율성이 좋음
- 버그의 원인은 대부분 변수의 잘못된 사용.
관찰 대상의 변수범위가 대폭 좁아지기 떄문에 디버깅이 편해짐!!

3. 메모리 절약 가능
- 함수 종료시 메모리에서 지워짐.

4. 특별한 기법에 활용
- 재귀 호출이나 상호 호출 같은 거.
- 다른 함수에서 변수 가져오기 까다롭다.

- 대략 전역 변수 남발말고 지역변수만 쓰라는 말..

13. 운영체제가 올라간 메모리에서 전역변수 남발하면 여러 함수에서 동시에 중복 접근할 경우 오류가 발생할 수 있다.

-정적 변수 - 다시 공부하기

14. extern int g; 식으로 선언하면 다른 소스코드에서 접근 가능. 그러나 static으로 선언된 변수는 접근 불가.

15. 정적 지역변수 - 하나의 함수가 여러 번 호출되는 경우 같은 변수를 공유할 수 있다.

                                  => 지역변수의 특징과 전역 변수의 특징을 둘 다 갖는다. (선언된 블록 안에서만 사용하는 전                                         역변수와 같다.)

16. int a -> 일반 변수는 메모리가 stack에 잡힘.

       static int a ->. data or. bss 등 전역 변수 공간에 메모리 잡힘.

17. 정적 지역변수는 반복문에서 초기화를 한 번만 할 때 사용하기도 함!

18. Static을 함수에 붙이는 이유.

=> 함수가 지역화됨. 즉 해당 소스코드에서만 동작한다.

이게 이득인 이유 => 외부 코드와 함수 이름이 겹쳐도 상관 없어진다. Local 화 되기 때문에 외부 소스코드에서 접근이 힘들어진다.

=> 디버깅할 때 용이하다. ==> 어느 함수에서 문제가 터지면 문제를 탐색할 소스코드가 줄어들어서!!! (엄청난 모듈화)

19. 외부용 함수 만들려면 static 많이 써서 모듈화해라!! 다른 .c 함수 파일에서 사용할 거면 Static 지워서 개방화하기!! 기본적으로 static ,  개방화할 거면 static 지우고!

 

수업 초반에는 설렁설렁 나가다가 막판에 중요하게 보이는 부분 많이 나갔다. 아무래도 교재 내용이 중요한 고급형으로 나가서 그런듯 싶다. 꼭 책 다시 제대로 읽어봐~~

 


* 개인적인 학습 목적으로 작성한 글이기에 내용에 잘못된 정보가 있을 수 있습니다.