검색결과 리스트
…™업무일지。에 해당되는 글 148건
- 2014.03.26 [smart]이재우-20140326
- 2014.03.25 [smart]이재우-20140325
- 2014.03.24 [smart]이재우-20140324 1
- 2014.03.21 [smart]이재우-20140321
- 2014.03.20 [smart]이재우-20140320
- 2014.03.19 [smart]이재우-20140319
- 2014.03.18 [smart]이재우-20140318
- 2014.03.17 [smart]이재우-20140317
- 2014.03.14 [smart]이재우-20140314
- 2014.03.13 [smart]이재우-20140313
글
2014. 03. 26 수업 및 과제
1 포인터 배열
1.1 예제
#include <stdio.h>
unsigned int Mystrlenth_max(char *);
int main()
{
char * cpStr = "1234A";
unsigned int uiNum;
uiNum = Mystrlenth_max(cpStr);
printf("%d \n",uiNum);
return 0;
}
unsigned int Mystrlenth_max(char *cpStr)
{
unsigned int uiCnt=0;
while(0! = *cpStr)
{
++cpStr;
}uiCnt = *cpStr;
return uiCnt;
}
'…™업무일지。' 카테고리의 다른 글
[smart]이재우-20140328 (0) | 2014.03.28 |
---|---|
[smart]이재우-20140327 (0) | 2014.03.27 |
[smart]이재우-20140325 (0) | 2014.03.25 |
[smart]이재우-20140324 (1) | 2014.03.24 |
[smart]이재우-20140321 (0) | 2014.03.21 |
설정
트랙백
댓글
글
2014. 03. 26 수업 및 과제
1 배열
1.1 배열 프로그램 시 주의 할 점
[예제]
#include
<stdio.h>
int main()
{
int arr1[3]; //
배열은
3
개
선언
arr[0]=1, arr[1]=2, arr[2]=3, arr[3]=4; //
실제
값은
4
개가
입력
return 0;
}
배열 프로그램 시 주의 사항)
컴파일 시 경고나 오류 메시지가 없음
실제 값은 4개가 입력되어 다른 메모리 영역을 침범 -> 치명적 오류 문제 발생
1.2 배열의 선언 및 초기화
[예제]
#include <stdio.h>
int main()
{
int arr1[5]={1,2,3,4,5};
int arr2[ ]={1,2,3,4,5,6,7};
int arr3[5]={1,2};
int ar1Len;
int ar2Len;
int ar3Len;
int iCnt;
printf("
배열 arr1
의
크기:%d \n", sizeof(arr1)); //int 4byte x 5 =20
printf("
배열 arr2
의
크기:%d \n", sizeof(arr2)); //int 4byte x 7 =28
printf("
배열 arr3
의
크기:%d \n", sizeof(arr3)); //int 4byte x 5 =20
ar1Len = sizeof(arr1) / sizeof(int); //
배열 arr1
의
길이
계산
ar2Len = sizeof(arr2) / sizeof(int); //
배열 arr2
의
길이
계산
ar3Len = sizeof(arr3) / sizeof(int); //
배열 arr3
의
길이
계산
for(iCnt=0; ar1Len>iCnt; ++iCnt)
printf("%d ", arr1[iCnt]);
printf("\n");
for(iCnt=0; ar2Len>iCnt; ++iCnt)
printf("%d ", arr2[iCnt]);
printf("\n");
for(iCnt=0; ar3Len>iCnt; ++iCnt)
printf("%d ", arr3[iCnt]);
printf("\n");
return 0;
}
[결과]
1.3 문자배열의 초기화
- printf(“%c \n”, str);
- “ABCD” 문자열을 초기화 하면 맨 끝에 null 값을 넣는다.
- %c 한 문자만 출력
- str &(주소)를 의미 한다.
[예제]
#include <stdio.h>
int main()
{
char
printf("배열 str의 크기: %d \n", sizeof(str) );
printf("널 문자 문자형 출력: %c \n", str[13] );
printf("널 문자 정수형 출력: %d \n", str[13] );
str[12]='?'; // 배열 str에 저장된 문자열 데이터는 변경 가능!
str[4]=0; // 0 null이 들어 간다
printf("문자열 출력: %s \n", str); //null(0) 이 나올때 까지 출력
printf("문자열 출력: %s \n", str);
printf("문자열 출력: %s \n", &str[5]); //&[5]번째 부터 null이 올때까지 출력
printf("문자열 출력2: %c \n", str[5]); //[5]번째 속한 %c한문자 출력
printf("%08X \n", &str);
printf("%08X \n", &str[0]);
return 0;
}
[결과]
1.4 배열을 이용한 문자열 변수의 표현
str.
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
G |
o |
o |
d |
|
m |
o |
r |
n |
i |
n |
g |
! |
null |
|
|
|
|
|
|
Ø
c
언어: “
문자열”
끝에 null
값이
들어감
Ø
어셈블리: “
문자열”
끝에 null
값이
들어가지
않음
Ø
문자열: null
이
포함된
문자배열.
Ø
배열을
포인터처럼
쓸
수
있다.[
예제2]
Ø
포인터를
배열처럼
쓸
수
있다. [
예제2]
Ø
str
포인터로
쓸
수
있다.(
값이
안
변하는
포인터)
Ø
cost
포인터와
같다.
Ø
예)char * const cp3=str;
[
예제1]
#include <stdio.h>
int main()
{
char str[]="Good morning!";
char *cp1;
char *cp2;
cp1=str; //cp1: str
의
주소상수를
담는
포인터(
주소)
변수
printf("%c \n", *cp1); //cp1
이
가리키는
주소의
한
문자
출력
printf("%s \n", cp1); //
포인터
변수
printf("%s \n", str); //
주소
상수
/*
++cp1;
printf("%s \n", cp1); //
변수
printf("%s \n", str); //
배열 str
자체가
주소
상수
*/
printf("----------------\n");
cp1=cp1+5;
printf("%s \n", cp1);
printf("%s \n", str+5);
printf("----------------\n");
cp2=str;
printf("%c \n", str[0]);
printf("%c \n", cp2);
printf("----------------\n");
printf("%c \n", *(str+1));
printf("%c \n", *(cp2+1));
printf("%c \n", cp2[1]);
printf("%c \n", str[1]);
return 0;
}
[예제2]
#include <stdio.h>
int main()
{
char str[]="%d %d\n";
char * cp1=str;
printf("%d %d\n", 100,50); //1 printf(” ”, ...);” ”
주소
상수
printf(cp1, 100,50); //2 printf(cp, ...);cp
주소
상수
printf(str, 100,50); //3 printf(str, ...);str
주소
상수
return 0; //1,2,3
모두
같은
결과값
출력
}
- “ABCD” 문자열을 초기화 하면 맨 끝에 null 값을 넣는다.
- %c 한 문자만 출력
- str &(주소)를 의미 한다.
.
'…™업무일지。' 카테고리의 다른 글
[smart]이재우-20140327 (0) | 2014.03.27 |
---|---|
[smart]이재우-20140326 (0) | 2014.03.26 |
[smart]이재우-20140324 (1) | 2014.03.24 |
[smart]이재우-20140321 (0) | 2014.03.21 |
[smart]이재우-20140320 (0) | 2014.03.20 |
설정
트랙백
댓글
글
2014. 03. 24 수업 및 과제
1 메모리 영역의 이해
-메모리의 영역 5종류
메모리 영역 | |
행위 영역 |
기억 영역 |
code 영역 =Ro 영역 =text 영역 |
Data(전역변수) BSS(전역변수) Heap(동적할당) Stack(지역변수) |
-메모리 영역의 설명
메모리의 영역 5종류 | ||
메모리 Name | 메모리 생성 | 메모리 저장 형태 |
Code(함수) =Ro 영역(Read only) =text 영역 |
1.Compile Time(컴파일시 만들어지며 실행파일(*.exe)의 용량에 포함) |
1.상수값
2.printf" "
|
Data(전역변수) |
1.Compile Time(컴파일시 만들어지며 실행파일(*.exe)의 용량에 포함) 2.프로 그램이 종료 할때 까지 남아 있음 3.전역변수가 많으면 실행파일( *.exe) 용량이 늘어남 4.자주쓰는 메모리는 전역 변수를 쓰는 것이 유리 |
1.전역변수 중 초기값 입력 메모리 |
BSS(전역변수) =Block startde by Symbol =Zi영역
|
1.자동 초기화 메모리 영역
2.Block startde by Symbol 3.initialize(초기화) 4.Zi(Zero initialize)영역 (0값으로 초기화 된 영역) | |
Heap(동적할당) |
||
Stack(지역변수) |
1.Rum Time 시 생성
2.자주쓰는 메모리를 Stack(지역변수)로 정의시 생성과 삭제를 반복하는 시간이 늘어 나므로 속도가 느려 짐 |
1.지역변수 2.point 주소 저장 3.배열의 상수 값
|
[예제]
#include <stdio.h>
void Add(int iVal); // iVal 지역 변수임
int iNum; // 전역변수는 기본 0으로 초기화됨
int iNum1=10; // 초기화 값을 준 것은 메모리 Data
int iNum2;
int iNum3=30;
int iNum4;
int iNum5=50;
int iNum6;
int iNum7=70;
int main()
{
printf("iNum:%d \n", iNum); // 전역변수 0으로 초기화
Add(3); //
printf("iNum:%d \n", iNum);
iNum++;
printf("iNum:%d \n", iNum);
printf("&iNum :%08X \n", &iNum);
printf("초기화&iNum1:%08X \n", &iNum1);
printf("&iNum2 :%08X \n", &iNum2);
printf("초기화&iNum3:%08X \n", &iNum3);
printf("&iNum4 :%08X \n", &iNum4);
printf("초기화&iNum5:%08X \n", &iNum5);
printf("&iNum6 :%08X \n", &iNum6);
printf("초기화&iNum7:%08X \n", &iNum7);
printf("---------------\n");
printf("&main :%08X \n", &main);
printf("&Add :%08X \n", &Add);
printf("&printf:%08X \n", &printf);
printf("문자 주소 :%08X \n", "Hello");
return 0;
}
void Add(int iVal)
{
iNum=iNum+iVal;
printf("&iVal:%08X \n", &iVal);
[결과]
2 Static 변수
-전역변수의 성격을 지니는 변수
-(지역변수 특성)선언된 함수 내에서만 접근이 가능.
-(전역변수 특성)딱 1회 초기화되고 프로그램 종료 시까지 메모리 공간에 존재
3 register 변수
-CPU 내에 존재하는 메모리
-연산속도가 빠르다.
-전역변수에는 register 변수를 선언 할 수 없다.
-선언을 힌트를 주는 것임:컴파일러가 합당하지 않다고 판단하면 레지스터에 할당 하지 않음
4 재귀 함수
-CPU 내에 존재하는 메모리
-연산속도가 빠르다.
-전역변수에는 register 변수를 선언 할 수 없다.
-선언을 힌트를 주는 것임:컴파일러가 합당하지 않다고 판단하면 레지스터에 할당 하지 않음
5 배열
[예제]
#include <stdio.h>
int main()
{
/*
int iNum1
=1;
int iNum2
=2;
int iNum3
=3;
int iNum4
=4;
int iNum5
=5;
int iNum6
=6;
int iNum7
=7;
int iNum8
=8;
int iNum9
=9;
printf("%d\n", iNum1);
printf("%d\n", iNum2);
printf("%d\n", iNum3);
printf("%d\n", iNum4);
printf("%d\n", iNum5);
printf("%d\n", iNum6);
printf("%d\n", iNum7);
printf("%d\n", iNum8);
printf("%d\n", iNum9);
*/
int iNum[9]; //
배열
선언으로
간단히
코딩
int iCnt;
for(iCnt=0; 9>iCnt ; ++iCnt)
iNum[iCnt]=iCnt;
for(iCnt=0; 9>iCnt ; ++iCnt)
printf("%d\n", iNum[iCnt]);
return 0;
}
'…™업무일지。' 카테고리의 다른 글
[smart]이재우-20140326 (0) | 2014.03.26 |
---|---|
[smart]이재우-20140325 (0) | 2014.03.25 |
[smart]이재우-20140321 (0) | 2014.03.21 |
[smart]이재우-20140320 (0) | 2014.03.20 |
[smart]이재우-20140319 (0) | 2014.03.19 |
설정
트랙백
댓글
글
2014. 03. 21 수업 및 과제
1 함수를 정의하고 선언하기
-함수의 원형 -> int 함수이름(); *세미콜론(;) 있을 때 원형 (호출 당하는 함수)
*함수의 원형이 모여 있는 곳이 <stdio.h> 즉 header 이다.
-함수의 선언 -> int 함수이름() *세미콜론(;) 없을 때에 선언
-함수의 호출시 호출 당한 함수의 메모리가 생성되고, 값을 반환한 이후 메모리는 사라짐.
-함수의 원형[int 함수이름();]는 main() 함수 이전에 위치 해야 하며
함수 선언은 어디에 있어도 관계가 없다.(컴파일 시 함수의 원형 존재 유무 파악이 필요)
A. 반환형: return 하는 값의 Type을 기술
1.1 함수의 유형
- 유형1: 전달인자(O) 반환 값(O)
- 유형2: 전달인자(O) 반환 값(X)
- 유형3: 전달인자(X) 반환 값(O)
- 유형4: 전달인자(X) 반환 값(X)
[예제]
#include <stdio.h>
int Add(int iNum1, int iNum2) //전달인자(O) 반환 값(O)
{
return iNum1+iNum2;
}
void ShowAddResult(int iNum) //전달인자(O) 반환 값(X)
{
printf("덧셈결과 출력:%d \n", iNum);
}
int ReadNum(void) //전달인자(X) 반환 값(O)
{
int iNum;
scanf("%d", &iNum);
return iNum;
}
void HowToUseThisProg(void) //전달인자(X) 반환 값(X)
{
printf("두 개의 정수를 입력하시면 덧셈결과 출력");
printf("자! 그럼 두개의 정수를 입력하세요.\n");
}
int main()
{
int iResult, iNum1, iNum2;
HowToUseThisProg();
iNum1=ReadNum();
iNum2=ReadNum();
iResult = Add(iNum1, iNum2);
ShowAddResult(iResult);
return 0;
}
[결과]
2 .h <stdio.h>
컴파일 시 전처리 에 포함
함수의 원형 -> int 함수이름(); 포함
3 .lib <*.lib>
컴파일 시 Linker에 포함
함수의 모음
4 컴파일 순서
*.c (전처리Perprocessor)-> *.i (Compiler)-> *.asm (as어셈블리)-> *.obj (Linker)-> *.exe
5 return이 지니는 두가지 의미
- 함수를 빠져나간다!- 값을 반환한다.
- 반환형이 void로 선언된 함수에서도 다음의 형태로 return 문을 사용할 수 있음
[예]
void HowToUseThisProg(int iNum)
{
if(iNum<0)
return; // 값을 반환하지 않는 return문!
. . . .
}
6 지역 변수 선언
- {} 중 괄호 안에 지역 변수을 선언 할 수 있다.
- {} 중 괄호 안에서 만 메모리에 존재 하며, 실행이 끝나면 메모리에서 사라짐
- 지역변수는 선언된 지역 내에서만 유효
- 선언된 지역이 다르면 변수 이름이 같아도 문제되지 않음
'…™업무일지。' 카테고리의 다른 글
[smart]이재우-20140325 (0) | 2014.03.25 |
---|---|
[smart]이재우-20140324 (1) | 2014.03.24 |
[smart]이재우-20140320 (0) | 2014.03.20 |
[smart]이재우-20140319 (0) | 2014.03.19 |
[smart]이재우-20140318 (0) | 2014.03.18 |
설정
트랙백
댓글
글
2014. 03. 20 수업 및 과제
1 Hexa View
- 주소/문자/A - 주소(address)범위: 4 byte, 32bit, 16진수 FFFF FFFF, 10진수(4,294,967,295)
- CPU BUS 라인에 따라 메모리 처리 용량이 결정
2 IEEE 754 - floating point (부동소수점)
IEEE 754는 컴퓨터에서 소숫점을 표현하기 위한 방법이다.
single precision은 32비트 즉 1워드에 저장하고
double precision은 64비트 즉 2워드에 저장한다.
이 비트를 3부분으로 나누어 부호, 소수부분, 지수부분으로 인식한다.
(-1)^s * (1 + F) * 2^E |
F : fraction
앞쪽 비트부터 2^-1, 2^-2... 를 의미한다.
E : exponent
지수부분 기본적으로 unsigned 이며 single precision에선 127, double에선 1023을 뺀다
S : sign
부호 0이면 양수, 1이면 음수
single [sign : 1bit][exponent : 8bit][fraction : 23bit]
double [sign : 1bit][exponent : 11bit][fraction : 52bit]
이 수를 single precision으로 보고 해석하면
1 0111 1110 1000 0000 0000 0000 0000 000 | ||
부호비트 |
|
|
1 |
0111 1110 |
1000 0000 0000 0000 0000 000 |
이 수를 single precision으로 보고 해석하면
1 : 음수
0111 1110 = 126
E = 126 - 127 = -1
1000 0000 0000 0000 0000 000 = 2^(-1) = 0.5 => 1.5
답은 -1 * 1.5 * 2^(-1) = -0.75 가 된다.
[예제]
실수 : 3.25의 값 계산
메모리 실제 저장 값 |
00 00 50 40 (Little Addian 방식으로 저장 Intel PC) | ||
숫자 정리 |
40 50 00 00 | ||
2진수 변환 |
4 0 5 0 0 0 0 0 0100 0000 0101 0000 0000 0000 0000 0000 => 4byte | ||
bit 별 기능 |
부호비트 1bit |
지수부(2^E) => 8bit |
가수부(1 + F) => 23bit |
0 |
1000 0000 |
1010 0000 0000 0000 0000 000 | |
+ |
128 64 32 16 8 4 2 1 승수 128-127= 1 =>2^1승 |
.1010 0000 0000 0000 0000 000 => 1.1010 0000 0000 0000 0000 000 | |
십진수로 변환 |
부호^s * (1 + F) * 2^E = 2^1 승 * 1.1010 0000 0000 0000 0000 000 = 11.010 = 1*(2^1)+1*(2^0).1*(2^-2) = 2+1.(1/4) = 3.25 |
3 함수
[Code(함수), Data(전역변수), BSS(전역변수), Heap(동적할당), Stack(지역변수)]
메모리의 영역 5종류
Code(함수) |
Data(전역변수) |
BSS(전역변수) |
Heap(동적할당) |
Stack(지역변수) |
남이 만든 함수를 가져오는 것(링크한다.)
C에서 만든 함수는 어셈블리로 가면 _언더바가 붙는다(규칙).
따라서 _언더바 없이 해석한다.
함수도 심볼 테이블(형식 Type, 변수 Name, 주소 Address)에 들어 간다.
변수 및 함수들의 주소는 한 곳에 몰려 있다.
3.1 Simbol Table(심볼 테이블)
Type 형식 |
Name 변수, 함수 이름 |
Address 주소 |
컴파일 처리 순서
*.c > *.i >*.asm >*.obj >*.exe
*.c > *.i > 심볼 테이블에 해당
3.2 리눅스에서 함수의 형식을 알수 있는 방법
리눅스에서 함수의 형식을 알수 있는 방법 | |
명령어 |
설명 |
man 숫자 함수명 |
메뉴얼 보기 *manual 약어 / 숫자:몇장(chpter) / 함수이름 예) man 3 printf ->printf(3) 장을 열다. |
q |
메뉴얼 끝내기 |
/abc |
단어 찾기 |
3.3 int printf(cons char *format, ....);
화면에 출력한 갯수를 반환한다.
int main(void);
int: 반환값의 Type
main: 이름
():인수/인자
'…™업무일지。' 카테고리의 다른 글
[smart]이재우-20140324 (1) | 2014.03.24 |
---|---|
[smart]이재우-20140321 (0) | 2014.03.21 |
[smart]이재우-20140319 (0) | 2014.03.19 |
[smart]이재우-20140318 (0) | 2014.03.18 |
[smart]이재우-20140317 (0) | 2014.03.17 |
설정
트랙백
댓글
글
2014. 03. 19 수업 및 과제
1 포인터(Pointer)의 이해
- 주소를 저장하기 위한 변수
- 주소(address)범위: 4 byte, 32bit, 16진수 FFFF FFFF, 10진수(4,294,967,295)
- CPU BUS 라인에 따라 메모리 처리 용량이 결정
2 메모리 저장방식의 이해
- Intel 컴퓨터 -> Little Eddian 방식
메모리 값:12345678
저장 메모리순서: 78563412
저장 메모리 순서가 틀린 이유: 계산을 주로 하는 컴퓨터 이기 때문에 속도를 위해 작은 숫자부터 저장.
- Super 컴퓨터 -> Big Eddian 방식
메모리 값:12345678
저장 메모리순서: 123456
저장 메모리 순서가 같은 이유: 대소 비교가 빠르다.(큰 값을 먼저 비교)
3 메모리 저장방식의 이해
- Intel 컴퓨터 -> Little Eddian 방식
[예제1]
#include <stdio.h>
int main()
{
int iNum=0x12345678;
char * p=(char*)&iNum;
/* char 형 값의 표현 범위 -128 ~ +127 */
/* char 형 값의 표현 범위 -128 ~ +127 */
/* char * p=(char*)&iNum; AA(1010 1010)=10진수 170(-40)
가 음수정수로 저장 되기 때문에 FFFFFFAA 가 저장됨*/
*p=0xAA;
printf("%08X \n", iNum);
printf("%02X \n", *p);
printf("%02X \n", *p);
printf("%02X \n", *p);
printf("%02X \n", *p);
return 0;
}
[결과]
[예제2]
#include <stdio.h>
int main()
{
int iNum=0x12345678;
unsigned char * p=(unsigned char*)&iNum;
/* char 형 값의 표현 범위 -128 ~ +127 */
/* unsigned char 형 값의 표현 범위 0 ~ +255 */
/* unsigned char * p=(unsigned char*)&iNum; AA(1010 1010)=10진수 +170
가 양의정수로 입력 되기 때문에 FFFFFFAA 가 000000AA로 저장됨 /
*p=0xAA;
printf("%08X \n", iNum);
printf("%02X \n", *p);
printf("%02X \n", *p);
printf("%02X \n", *p);
printf("%02X \n", *p);
return 0;
}
[결과]
[예제3]
#include <stdio.h>
int main()
{
int iNum=0x12345678;
unsigned char * p=(unsigned char*)&iNum;
*p=0xAA;
printf("%08X \n", iNum);
printf("%02X \n", *p);
printf("%02X \n", *(p+1));
printf("%02X \n", *(p+2));
printf("%02X \n", *(p+3));
return 0;
}
[결과]
4 포인터의 연산 및 자료형에 따른 출력 변화
- 포인터에 주소값을 가지므로 + - ++ --연산자를 쓸 수 있다. (기타 다른 연산자(* / .. 는 쓸 수 없다.) [예제]
[예제1]
#include <stdio.h>
int main()
{
int iNum=0x12345678; /* int 4byte */
unsigned char * p=(unsigned char*)&iNum; /* unsigned char 1byte */
unsigned short * sp=(unsigned short*)&iNum; /* unsigned short 2byte */
*p=0xAA; /* 실제 메모리 Little Eddian 저장방식 AA563412 */
printf("%08X \n", iNum); /* 123456AA 화면에 출력시 순서대로 출력 */
printf("%02X \n", *p); /* AA 실제 메모리 Little Eddian 저장방식 */
printf("%02X \n", *(p+1)); /* 56 실제 메모리 Little Eddian 저장방식 */
printf("%02X \n", *(p+2)); /* 34 실제 메모리 Little Eddian 저장방식 */
printf("%02X \n\n", *(p+3)); /* 12 실제 메모리 Little Eddian 저장방식 */
printf("%08X \n", p); /* p주소: 0012FF6C 출력 */
printf("%08X \n", (p+1)); /* p+1주소: 0012FF6D 출력 */
printf("%08X \n", (p+2)); /* p+2주소: 0012FF6E 출력 */
printf("%08X \n\n", (p+3)); /* p+3주소: 0012FF6F 출력 */
printf("%04X \n", *sp); /* sp가 가리키는 값(iNum): 56AA 출력 */
/* AA56이 아닌 이유: sp가 short형 이므로 2byte씩 출력 */
return 0;
}
[결과]
[예제2]
#include <stdio.h>
int main()
{
int iNum=0xABCDEF98; /* 실제 메모리 저장: 98EFCDAB */
unsigned char * uCPDATA = (unsigned char *)&iNum;
printf("%02X \n", *uCPDATA); /* 98 1 byte 출력*/
++uCPDATA; /* 1 uCPDATA 주소 1byte 증가*/
printf("%02X \n", *uCPDATA); /* EF 다음(98) 1 byte 출력*/
++uCPDATA; /* 1 uCPDATA 주소 1byte 증가*/
printf("%02X \n", *uCPDATA); /* CD 다음(EF) 1 byte 출력*/
++uCPDATA; /* 1 uCPDATA 주소 1byte 증가*/
printf("%02X \n", *uCPDATA); /* AB 다음(CD) 1 byte 출력*/
return 0;
}
[결과]
[예제3] 예제2의 for문으로 출력
#include <stdio.h>
int main()
{
int iCnt;
int iNum=0xABCDEF98; /* 실제 메모리 저장: 98EFCDAB */
unsigned char * uCPDATA = (unsigned char *)&iNum;
for(iCnt=0;4>iCnt;++iCnt)
{
printf("%02X ", *uCPDATA); /* 98 앞쪽 1 byte 출력*/
++uCPDATA; /* 1 uCPDATA 주소 1byte 증가*/
}
return 0;
}
[결과]
'…™업무일지。' 카테고리의 다른 글
[smart]이재우-20140321 (0) | 2014.03.21 |
---|---|
[smart]이재우-20140320 (0) | 2014.03.20 |
[smart]이재우-20140318 (0) | 2014.03.18 |
[smart]이재우-20140317 (0) | 2014.03.17 |
[smart]이재우-20140314 (0) | 2014.03.14 |
설정
트랙백
댓글
글
2014. 03. 18 수업 및 과제
1 포인터(Pointer)의 이해
1.1 메모리 구조
- 일반적[1 byte(8 bit) 단위 마다 주소(address)를 지정]
- &변수명 :address 지정
[예제]
#include <stdio.h>
int main()
{
int iNum=0;
printf("%d \n", iNum); /* 0 */
printf("%d \n", &iNum); /* 1245044 */
printf("%X \n", &iNum); /* 12FF74 */
printf("%08X \n", &iNum); /* 0012FF74 08X: 8자리 빈자리에 0입력 16진수 출력*/
printf("%p \n", &iNum); /* 0012FF74 %p: 포인터의 16진수 주소값 출력*/
return 0;
}
1.2 포인터(Pointer)설명
* : 주소(단항 /캐스팅) = 캐스팅 연산자 역할 (일시적인 형변환)
* : 값(단항)
[예제]
#include <stdio.h>
int main()
{
int iNum = 0;
// &iNum = 100; 컴파일 waring C4047 &iNum 같지않다 int형 (100)
iNum 의 주소상수(&) 를 의미함
// (int*)0x12FF74 = 100; 컴파일 waring C4047 (int *)0x12FF74 같지않다 int(100)
iNum 의 주소상수(&) 를 의미함
*(int*)0x12FF74 = 100; *(int*)0x12FF74 좌변은 iNum 의 변수 를 의미
printf("%08X \n", &iNum);
printf("%d \n", iNum);
*(&iNum) = 1000; (int *)0x12FF74 = &iNum 이랑 같다.
*& 가 만나면 서로 상쇄된다.
printf("%08X \n", &iNum);
printf("%d \n", iNum);
return 0;
}
1.3 캐스팅 연산자
* : 곱셈(2항 )
[예제]
#include <stdio.h>
int main()
{
int iNum=0;
int iAddr=0;
int *iP;
iAddr=(int)(&iNum); warning error
iAddr=&iNum; -> 좌변은 int(정수형) 우변은 int * (정수형 주소상수)
printf("%08X \n", iAddr); // 0012FF6C &iNum 주소값
*( (int*)iAddr )=1000; // 1000을 iAddr 주소 포인터에 넣어라.
printf("%d \n", iNum); // 1000 1000출력
iP=&iNum;
*iP=999;
printf("%d \n", iNum); // 999
return 0;
}
[결과]
1.4 point 연산자 활용
[예제]
#include <stdio.h>
int main()
{
int iNum=0;
int * iP=&iNum;
printf("%d \n", iNum); // 0 iNum 변수값
printf("%08X \n", &iNum); // 12FF70 iNum 자신의 주소값
printf("%08X \n", iP); // 12FF70 iP 변수(&iNum주소)값
printf("%08X \n", &iP); // 12FF74 *iP 자신의 주소값
printf("%d \n", *iP); // 0 &iP 주소가 가리키는 변수(iNum)의 값
return 0;
}
[결과]
'…™업무일지。' 카테고리의 다른 글
[smart]이재우-20140320 (0) | 2014.03.20 |
---|---|
[smart]이재우-20140319 (0) | 2014.03.19 |
[smart]이재우-20140317 (0) | 2014.03.17 |
[smart]이재우-20140314 (0) | 2014.03.14 |
[smart]이재우-20140313 (0) | 2014.03.13 |
설정
트랙백
댓글
글
2014. 03. 17 수업 및 과제
1 continue & break
1.1 break
-Switch, 반복문(if else, for, while) 에 쓰임
-break를 만나면, 프로그램을 빠져나감
1.2 continue
-for문에서 continue를 만나면 증감수행으로 돌아감
-while(조건)문에서 continue를 만나면 조건으로 돌아감
[예제1]구구단을 출력하되 짝수 단(2단, 4단, 6단, 8단)만 출력되도록 하자, 또한 2단은 2 x 2까지, 4단은 4 x 4까지,
6단은 6 x 6까지, 8단은 8 x 8까지, 출력되도록 프로그램 구현
#include <stdio.h>
int main()
{
int iNum, iDan;
for(iDan=1 ; iDan<10 ; iDan++)
{
if(iDan%2!=0)
continue;
for(iNum=1 ; iNum<10 ; iNum++)
{
if(iDan<iNum)
break;
printf("%d * %d = %d \n", iDan, iNum, iNum*iDan);
}
printf("\n");
}
printf("\n");
return 0;
}
[실행]
[예제2] 다음 식을 만족하는 모든 A와 Z를 구하는 프로그램 작성
#include <stdio.h>
int main()
{
int iA, iZ;
int iResult;
for(iA=0;10>iA;iA++)
{
for(iZ=0;10>iZ;iZ++)
{
/* if(iA==iZ)
continue;
*/ iResult=(iA*10+iZ)+(iZ*10+iA);
if(iResult==99)
printf("%d%d+%d%d=%d \n", iA, iZ, iZ, iA, iResult);
}
}
return 0;
}
[결과]
2 switch & case
구간, 범위를 설정 할 때는 if문이 유리
특정 조건이 정해진 때는 switch case문이 유리
2.1 switch(정수형 변수)
조건: 정수형 변수만 올 수 있음
2.2 case(상수형 정수)
조건: 상수형 정수만 올 수 있음
[예제]
#include <stdio.h>
int main()
{
int iNum;
printf("숫자을 입력:");
scanf("%d", &iNum);
switch(iNum)
{
case 1:
printf("1를 입력하였습니다.\n");
break;
case 2:
printf("2를 입력하였습니다.\n");
break;
case 3:
printf("3를 입력하였습니다.\n");
break;
case 4:
printf("4를 입력하였습니다.\n");
break;
case 5:
printf("5를 입력하였습니다.\n");
break;
default:
printf("잘 못 입력 하였습니다!\n");
break; /* 생략되어도 되나 일반적으로 다 적어 줌 */
}
return 0;
}
[결과]
3 goto문
프로그램 시 사용하지 않는 것이 좋다.
2.1 goto문 무한루프
:AAA
printf("무한루프\n");
goto AAA;
'…™업무일지。' 카테고리의 다른 글
[smart]이재우-20140319 (0) | 2014.03.19 |
---|---|
[smart]이재우-20140318 (0) | 2014.03.18 |
[smart]이재우-20140314 (0) | 2014.03.14 |
[smart]이재우-20140313 (0) | 2014.03.13 |
[smart]이재우-20140312 (0) | 2014.03.12 |
설정
트랙백
댓글
글
2014. 03. 14 수업 및 과제
1. for문의 구조와 이해
for문 예시 .아래 문장들은 5번,6번 문장을 제외 한 모두 같은 결과
#include <stdio.h>
int main()
{
int iNum1;
int iNum2;
/*1-----------------------------------------------------------------
for(iNum1=1,iNum2=0 ; iNum1<5 ; iNum1=iNum1+1,iNum2=iNum2+2)
{
printf("iNum1=%d, iNum2=%d\n", iNum1, iNum2);
}
초기식 , 증감식은 콤마(,)구분으로 여려 문장을 쓸 수 있음*/
/*2-----------------------------------------------------------------
iNum2=0;
for(iNum1=1; iNum1<5 ; iNum1=iNum1+1)
{
printf("iNum1=%d, iNum2=%d\n", iNum1, iNum2);
iNum2=iNum2+2;
}
*/
/*3-----------------------------------------------------------------
iNum1=1;
iNum2=0;
for( ; iNum1<5 ; )
{
printf("iNum1=%d, iNum2=%d\n", iNum1, iNum2);
iNum2=iNum2+2;
iNum1=iNum1+1;
}
*/
/*4-----------------------------------------------------------------
iNum1=1;
iNum2=0;
while(iNum1<5)
{
printf("iNum1=%d, iNum2=%d\n", iNum1, iNum2);
iNum2=iNum2+2;
iNum1=iNum1+1;
}
*/
/*5-----------------------------------------------------------------
for(iNum1=1,iNum2=0 ; iNum1<5 ; iNum1=iNum1+1,iNum2=iNum2+2)
printf("iNum1=%d, iNum2=%d\n", iNum1, iNum2);
처리 문장이 한줄 일때는 중괄호 생략 가능*/
/*6-----------------------------------------------------------------
iNum2=0;
for(iNum1=1; iNum1<5 ; iNum1=iNum1+1)
printf("iNum1=%d, iNum2=%d\n", iNum1, iNum2);
iNum2=iNum2+2;
처리 문장이 두줄 일때는 두번째 문장 한번만 실행*/
return 0;
}
[결과]
2. 무한 루프 예
[예제]
#include <stdio.h>
int main()
{
unsigned int uiCnt=0;
for(;;) /* 무한루프 조건식 공백 같은 결과 while(1) */
{
printf("%u \n", uiCnt);
++uiCnt;
}
return 0;
}
[결과]
0에서 1증가 하면서 무한 반복
3. 조건적 실행과 흐름의 분기
3.1 if문
참이면 실행 거짓이면 건너뜀
[예제1]
#include <stdio.h>
int main()
{
int iNum;
scanf("%d", &iNum);
printf("입력하신 숫자는 %d입니다.\n", iNum);
if(100<iNum) /* 조건이 참이면 실행/ 아니면 분기(건너뜀)*/
{
printf("입력하신 숫자는 100보다 커다\n");
}
return 0;
}
[결과]
[예제2]
#include <stdio.h>
int main()
{
int iNum;
for(iNum=1; iNum<100; ++iNum)
{
if( (0==(iNum%3) ) || (0==(iNum%4) ) ) 연산우선 순위 비교를 괄호를 필히 해준다.
{ 문장의 명확을 위해 중괄호를 해주는 것이 좋다.*/
printf("3 or 4 배수 %d \n",iNum);
}
} return 0;
}
[결과]
3.2 if~else 문
if절의 조건이 참이면 if블록 거짓이면 else블록 실행
else은 if가 반듯이 있어야 가능한 문장
[예제]
#include <stdio.h>
int main()
{
int iNum;
printf("정수 입력:");
scanf("%d", &iNum);
if(iNum>0)
{
printf("%d이 0보다 큰 수\n", iNum);
}
else
{
printf("%d이 0보다 작은 수\n", iNum);
}
return 0;
}
[결과]
3.3 if else if문
셋 이상의 블록 중 하나를 선택해서 실행
3.4 삼항 연산자
조건 ? data1 : data2
조건이 참이면 data1반환 거짓이면 data2 반환
int iNum3= (iNum1>iNum2) ? (iNum1) : (iNum2);
[예제]
#include <stdio.h>
int main()
{
int iNum1, iNum2;
int iResult;
printf("두 개의 정수 입력: ");
scanf("%d %d", &iNum1, &iNum2);
iResult= (iNum1>iNum2) ? iNum1-iNum2:iNum2-iNum1;
printf("뺄셈의 결과: %d \n",iResult);
return 0;
}
[결과]
'…™업무일지。' 카테고리의 다른 글
[smart]이재우-20140318 (0) | 2014.03.18 |
---|---|
[smart]이재우-20140317 (0) | 2014.03.17 |
[smart]이재우-20140313 (0) | 2014.03.13 |
[smart]이재우-20140312 (0) | 2014.03.12 |
[smart]이재우-20140311 (0) | 2014.03.11 |
설정
트랙백
댓글
글
2014. 03. 13 수업 및 과제
07. 반복실행을 명령하는 반복문
7.1 while
[예제]
#include <stdio.h>
int main()
{
int iCnt;
iCnt=0;
while(3>iCnt) /* 조건: (논리연산자)참/거짓으로 판단 */
{
printf("test\n");
++iCnt;
}
return 0;
}
[결과]
7.1.1 while 무한루프의 구성
while(1)
{
printf("무한 루프\n");
}
7.2 for문
[예문]
#include <stdio.h>
int main()
{
int iCnt;
for(iCnt=0;3>iCnt;++iCnt) /* for(초기식;조건식;증감식) */
{
printf("test\n"); /* 반복의 문장 */
}
return 0;
}
[결과]
'…™업무일지。' 카테고리의 다른 글
[smart]이재우-20140317 (0) | 2014.03.17 |
---|---|
[smart]이재우-20140314 (0) | 2014.03.14 |
[smart]이재우-20140312 (0) | 2014.03.12 |
[smart]이재우-20140311 (0) | 2014.03.11 |
[smart]이재우-20140310 (0) | 2014.03.10 |
RECENT COMMENT