C언어 교육 7

[9일차] C언어 교육-(함수 포인터, 동적 할당 메모리, 구조체 등)

1. 함수 포인터 배열 사용 예시 - 포인터 배열을 형 변환하여 함수 포인터로 만들었다. (*괄호 연산자 위치 중요!) #include int sum(int a, int b); int sub(int a, int b); int mul(int a, int b); int main() { int res; void* sub1 = sub; void* mul1 = mul; //void 포인터 void* vpa[3] = {sum, sub, mul1}; //void 포인터 배열 초기화 res = ((int (*)(int, int))vpa[1])(1, 2); printf("result is %d", res); return 0; } int sum(int a, int b){ return a+b; } int sub(int a,..

[8일차] C언어 교육8-(포인터 배열, 배열 포인터, 함수 포인터)

1. 포인터 변수로 배열의 주소를 받는 경우. int arr[4] = {2, 4, 7, 9}; int * p; p=arr; arr[2] = 100; //이렇게 대입할 경우. //다음도 가능하다. p[2] = 100; *(p+2) = 100; 2. 이중 포인터 : 포인터 변수의 주소를 저장하는 포인터 변수. 1) 포인터 변수를 교환하는 함수의 매개변수 #include void swap_ptr(char** ppa, char** ppb); int main(void) { char* pa = "success"; char* pb = "failure"; printf("pa -> %s, pb -> %s\n", pa, pb); // 바꾸기 전에 문자열 출력 swap_ptr(&pa, &pb); // 함수 호출 printf..

[7일차] C언어 교육7-(2차원 배열, 포인터 배열 등)

강사님이 바뀌고, 포인터와 배열에 대한 개념을 설명하기 위해 좌-우파 구도 개념과 n차라는 개념을 만들어서 설명해주시는데, 설명하기 위해 새로운 개념을 또 배워야 하니 더 복잡하고 어려워지는 것 같다... 얼추 무슨 의미인지는 알겠지만, 원래이해하고 있던 방식과 이해 방식이 달라서 혼란스럽다..ㅎ.. 열성적으로 가르쳐주시지만 뭔가 큰 그림을 그려놓고 진행되기보다는 작은 것 하나에 엄청 몰두해서 알려주시는 느낌이다. 1. 좌파우파 차수 개념 데이터가 나오고 주소 값이 나오고 가 중요한데 좌파 우파가 중요해진 느낌.. 2. 초기화 하지 않은 전역 변수는 file size에 영향을 미치지 않는다.(hdd) 하지만 ram에서 돌아가기 시작하면 '0'으로 초기화되면서 메모리 사용한다. 3. static 전역변수 ..

[6일차] C언어 교육6-(새롭게 진도 나감. ~포인터, 배열)

교육 2주 차가 시작됐다. 오늘부터 일주일간 새로운 강사님에게 임베디드 C 프로그래밍 수업을 배우는 날이다. 임베디드 C 프로그래밍이지만 그냥 C언어다. C언어 진도를 다시 처음부터 나갔다. 1. @head 부분 : 함수에 사용될 각종 변수와 배열등을 선언한 부분, 2. @body 부분 : 선언된 각종 변수와 배열등이 사용되어 코드가 진행되는 부분. (과거 C 버전에서는 body부분에서 변수 정의를 할 수 없었지만 최근 버전에는 가능해졌다. but 그로 인해 포인터에서 문제가 발생하는 경우가 있다.) 3. 변수 a=10; 왼쪽 부분 : Lvalue = 오른쪽 부분 : Rvalue 4. int = double -> loss 발생. 5. char str1[] = "hello"; //포인터 상수 -> stac..

[5일차] C언어 교육5-(구조체, 링크드리스트, 공용체, 열거형, 마크다운)

C언어 마지막 날. 다음 주부터는 새로운 강사님과 임베디드 C 프로그래밍을 배우게 된다. 이제 많이 모르는 개념들 위주로 진도를 나가는데 너무 빠르게 나가는 탓에 공부할 거리만 많아지는 느낌이다. - 구조체 1. 구조체 크기에 대해 공부. -> 구조체는 가장 큰 멤버의 크기로 따라감. typedef _Student{ int num; //4byte double grade; //8byte }student; 이런 구조체 만들면 이런식으로 16byte의 크기가 된다는 말이다! 2. 구조체는 멤버의 순서에 따라 구조체 전체의 크기가 달라질 수 있다! #pragma pack(1) 을 사용하면 구조체의 크기는 모든 멤버의 크기를 더한 것과 같아진다 => 패딩바이트를 없애줘서 메모리를 최소화시킨다. 데이터를 읽고 쓰는..

[4일차] C언어 교육4-(이중포인터, 포인터 배열, 배열 포인터, 동적할당함수)

확실히 고급편으로 넘어가고부터 내용이 어려워졌다.. 1. static 전역변수 -> 다른 소스에서 접근 불가 2. static 지역변수 -> 전역변수의 특성도 갖게 됨. (초기화 1번만 된다.) 3. 함수 static -> 소프트웨어를 모듈화 할 수 있다. 4. 레지스터 변수 -> 변수가 stack에 저장되지 않고 가장 빠른 레지스터에 저장된다. 그리고 중괄호(함수) 끝날 때까지 레지스터에 존재. (메모리에 있는 것이 아니기 때문에 변수의 주소를 구할 수 없다. and 개수가 별로 없다.) 5. ARM은 RISC 프로세스 - RISC? >>> 6. call by value 와 call by reference의 차이. 포인터를 이용해 주소로 접근하는 후자 방식은 변수의 데이터를 바꿀 수 있다. 7. 크기가..

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

오늘 강의 시작은 강사님의 당부의 말로 시작되었다. "너무 한 번에 다 알려고 조급해하지 마세요~ 나중에 다 이해 가능합니다. 다만 주의사항! 손으로 직접 해봐야 합니다! 단순히 따라 하는 것이 아닌 안 보고 코드를 직접 짜 봐야 합니다! 만고불변의 법칙은 손가락이 기억한다는 것입니다!" 뭔가 대충 나가는 듯하면서도 궁금했던 점이나 헷갈렷던 점들은 잘 짚어주신다. 1. 포인터 기호 " * " : '간접참조연산자' 라고한다. 2. 다시 한번! 포인터는 주소를 저장하는 변수일뿐입니다! 3. 32bit 머신에서 주소 값은 모두 4byte이다!! 따라서 char*, int*, double* 포인터의 크기 모두 4byte이다! '주소 값'이기 때문에. 4. 포인터의 장점 - 매개변수를 통해 주소로 변수에 접근하기..