■ volatile : 휘발성
1. |
변수 선언 앞에 붙이면 컴파일 과정에서 컴파일러가 함부로 최적화하지말고 코딩된 원래 의도대로 하라는 의미 |
2. |
캐시 쓰지마라(캐시쓰지말고 장치나 메모리에 계속 값을 쓰고 가지고 오라는 의미 |
ARM에서 주소값 캐스팅 할때... |
ex) (Volatile unsigned int *)0xFFFFF400 |
※ MCU(Micro Controller unit) : 특정시스템을 제어하기 위한 전용 프로세서로 ROM과 RAM을 내장하고 있음
■ 문자열을 다루는 2차원 배열
|
#include <stdio.h> #include <string.h>
int main() { int i; char student[5][20];//2차원 배열을 선언하여 문자열을 편하게 다룰수 있음
for(i = 0; i < 5; ++i) { printf("Please enter student name: "); gets(student[i]);//gets()함수는 입력된 글자가 20바이트(선언된 크기)를 넘으면 오버되어 다음줄 배열로
// 넘어간다 그리고 그 다음줄에 NULL을 만든다 그러므로 puts()로 찍어보면 널을만날때까지 // 출력되므로 2번째줄 배열까지 출력된다. } for(i = 0; i < 5; ++i) { puts(student[i]); } return 0; }
|
■ 문자열을 가리키는 포인터의 배열
#include <stdio.h> #include <string.h>
#define MAXSTD 10 #define NAMELEN 15
int main() { char student[MAXSTD][NAMELEN]; char *stptr[MAXSTD]; char *temp; int i; int j; int count; count = 0;
printf("Please enter name of student \n");
while(count < MAXSTD) { printf("student %d : ", count + 1 ); gets(student[count]); stptr[count++] = student[count];// 배열 1줄의 주소를 포인터 배열에 넣음 }
for (i = 0; i < count-1; ++i ) { for (j = i+1; j < count; ++j) { if(strcmp (stptr[i], stptr[j]) > 0) // 배열의 알파벳 순서를 비교하여
{ //배열의 내용을 스와핑하는 것이 아니라 temp = stptr[j]; // 포인터배열의 주소만 스와핑하여 용량적인 면에서 장점을 가짐 stptr[j] = stptr[i]; stptr[i] =temp; } }
}
printf("\nstudent List : \n");
for (i = 0; i < count; ++i ) { printf("student %d: %s\n", i+1, stptr[i]); }
return 0; } |
■ Main 함수의 인자
#include <stdio.h>
int main(int iNum, char *command[]) { int iCnt; //main 함수 인자로 int형 정수를 넘겨받으면 printf("%d\n", iNum); //실행파일을 실행시킬때 띄어쓰기로 구분하여 //단어(실행파일이름을 포함)가 몇개 적혔는지 갯수를 넘겨줌
for(iCnt = 0; iCnt < iNum; ++iCnt) { //main 함수 인자로 char *형 주소값을 넘겨받으면....
printf("%s\n", command[iCnt]); //실행파일을 실행시킬때 띄어쓰기로 구분하여 // 여러단어를 적으면 각각의 단어(실행파일이름을 포함)는 //메모리로 올라가고 그 각각의 메모리 주소가 포인터배열에 저장된다. } // %s로 각각의 주소를 출력해보면 어떤 단어를 입력했는지 알수 있다. // 마지막 단어 다음 배열의 주소에는 NULL이 들어가있음. return 0; } |
----------
8_10.c
8_11.c
8_12.c
8_13.c
8_14.c
test.c
----------