오늘 강의 시작은 강사님의 당부의 말로 시작되었다.
"너무 한 번에 다 알려고 조급해하지 마세요~ 나중에 다 이해 가능합니다. 다만 주의사항! 손으로 직접 해봐야 합니다! 단순히 따라 하는 것이 아닌 안 보고 코드를 직접 짜 봐야 합니다! 만고불변의 법칙은 손가락이 기억한다는 것입니다!"
뭔가 대충 나가는 듯하면서도 궁금했던 점이나 헷갈렷던 점들은 잘 짚어주신다.
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 지우고!
수업 초반에는 설렁설렁 나가다가 막판에 중요하게 보이는 부분 많이 나갔다. 아무래도 교재 내용이 중요한 고급형으로 나가서 그런듯 싶다. 꼭 책 다시 제대로 읽어봐~~
* 개인적인 학습 목적으로 작성한 글이기에 내용에 잘못된 정보가 있을 수 있습니다.
'임베디드 개발(before) > IoT 임베디드 SW 개발자 양성과정' 카테고리의 다른 글
[6일차] C언어 교육6-(새롭게 진도 나감. ~포인터, 배열) (1) | 2020.07.20 |
---|---|
[5일차] C언어 교육5-(구조체, 링크드리스트, 공용체, 열거형, 마크다운) (0) | 2020.07.17 |
[4일차] C언어 교육4-(이중포인터, 포인터 배열, 배열 포인터, 동적할당함수) (0) | 2020.07.16 |
[2일차] C언어 교육2-(조건문, 반복문, 함수, 배열, 포인터) (0) | 2020.07.14 |
[1일차] C언어 교육 (2) | 2020.07.13 |