검색결과 리스트
언어로그/C/C++에 해당되는 글 23건
- 2015.08.30 [C/C++] C 언어 포스트 목록
- 2011.06.13 과제 #2 제어문/선택문을 이용해 다양한 모양그리기
- 2011.06.13 과제 #1 입출력,연산자
- 2011.06.13 음수의 표현
- 2011.04.29 문자열 조작함수 직접 구현하기 (2)
- 2011.03.27 라인 입출력 함수
- 2011.03.27 배열의 이해
- 2011.03.27 기억부류(Storage Class) / 변수
- 2011.03.27 전역변수와 지역변수
- 2011.03.27 함수의 이해
글
[C/C++] C 언어 포스트 목록
언어로그/C/C++
2015. 8. 30. 14:19
- C 언어란?
- C 프로그램 실행과정
- C 언어 학습에 핵심. 변수와 상수
- 음수의 표현
- 표준 입출력 함수 printf(), scanf()
- 비표준 입출력함수 getch(), getche()
- 매크로, 연산자
- 포인터의 이해
- 함수의 이해
- 전역변수와 지역변수
- 기억부류, 변수
- 배열의 이해
- 라인 입출력 함수
- 문자열 조작함수 직접 구현하기
- 과제 #1 입출력, 연산자
- 과제 #3 함수, 포인터의 사용
- 과제 #4 배열과 문자열
- 비트필드
- puchchar()
- scanf()
- 성적관리 프로그램
- 바이트 오더링
- 분할 컴파일
- 배열의 전달과 요소접근
- 구조체
- 전처리 지시어
- 파일 입출력
- 포인터 응용
'언어로그 > C/C++' 카테고리의 다른 글
| [C/C++] C 언어 포스트 목록 (0) | 2015.08.30 |
|---|---|
| 과제 #2 제어문/선택문을 이용해 다양한 모양그리기 (0) | 2011.06.13 |
| 과제 #1 입출력,연산자 (0) | 2011.06.13 |
| 음수의 표현 (0) | 2011.06.13 |
| 문자열 조작함수 직접 구현하기 (2) | 2011.04.29 |
| 라인 입출력 함수 (0) | 2011.03.27 |
설정
트랙백
댓글
글
과제 #2 제어문/선택문을 이용해 다양한 모양그리기
언어로그/C/C++
2011. 6. 13. 23:08
#1. 윤년구하기
사용자에게 년도를 입력받아 윤년인지 아닌지를 판단하는 프로그램을 작성.
단, 하나의 1f~else 문을 이용하여 작성.
윤년의 조건
4로 나누어 떨어지는 해
그 중에서 100으로 나누어 떨어지는 해는 평년
하지만 400으로 나누어 떨어지는 해는 윤년
#2. 삼각형과 역삼각형 출력
선택 및 반복문을 이용하여 작성
임의 숫자를 입력받아 삼각형과 역삼각형 출력
결과
#3. 다이아몬드 출력
선택 및 반복문을 이용하여 작성
임의 숫자를 입력받아 삼각형과 역삼각형 출력
결과
#4. 다이아몬드 테두리 출력
선택 및 반복문을 이용하여 작성
임의 숫자를 입력받아 삼각형과 역삼각형 출력
결과
#5. 알파벳 출력
메뉴번호를 입력하면, 각 문자열 도형 출력.
정수 65부터 90까지가 ASCII A-Z 임.
결과
'언어로그 > C/C++' 카테고리의 다른 글
| [C/C++] C 언어 포스트 목록 (0) | 2015.08.30 |
|---|---|
| 과제 #2 제어문/선택문을 이용해 다양한 모양그리기 (0) | 2011.06.13 |
| 과제 #1 입출력,연산자 (0) | 2011.06.13 |
| 음수의 표현 (0) | 2011.06.13 |
| 문자열 조작함수 직접 구현하기 (2) | 2011.04.29 |
| 라인 입출력 함수 (0) | 2011.03.27 |
설정
트랙백
댓글
글
과제 #1 입출력,연산자
언어로그/C/C++
2011. 6. 13. 23:01
#1 온도변환 : 화씨, 섭씨
화씨 온도(F)를 입력 받은 후 섭씨 온도(C)로 계산하여 출력하는 프로그램
C = 5/ 9 * (F -32)
화씨 온도를 입력하세요 : 85
섭씨 온도는 29.4도 입니다.
#2 원의 넓이 구하기
사용자 입력으로 원의 반지르을 입력받고, 원의 넓이를 구하는 프로그램
원의 넓이 = 반지름 * 반지름 * 3.14159
원의 반지름을 입력하세요 : 10.5
원의 면적 346.36
#3 신체질량지수(BMI)
몸무게와 키를 입력받고, 신체질량지수(BMI)를 구하는 프로그램 작성. BMI는 비만도를 측정하는 한가지 방법.
BMI = 몸무게(kg) / 키(m)의 제곱
몸무게를 입력하세요( kg) : 62
키를 입력하세요(m) : 1.75
당신의 BMI는 : 20.2입니다.
#4 거리 및 속력계산
거리(km)와 속력(km/h)을 입력받고, 해당 거리를 속력으로 달릴 때 걸리는 시간 출력 프로그램 작성.
거리, 속력은 실수. 시간은 시간, 분까지 계산 출력. 초는 소수점 이하 셋째 자리까지 출력
거리(km)을 입력하세요 : 100
속력(km/h)을 입력하세요 : 85
걸리는 시간은 : 1시간, 10분, 35.294초 입니다
걸리는 시간은 : 1시간, 10분, 35.294초 입니다
#5 자판기 잔돈계산
커피 자판기에 입력받은 돈으로 거스름돈 계산 하는 프로그램 작성
커피 값은 150원
지폐는 1000단위만 입력가능.
거스름 돈은 500원, 100원, 50원, 10원.
자판기가 내주는 동전의 종류와 수를 계산하시오
돈을 입력하세요 : 1000
잔돈 드릴게요 ..
500원짜리 동전 1개
100원짜리 동전 3개
50원짜리 동전 1개
10원짜리 동전 0개
'언어로그 > C/C++' 카테고리의 다른 글
| [C/C++] C 언어 포스트 목록 (0) | 2015.08.30 |
|---|---|
| 과제 #2 제어문/선택문을 이용해 다양한 모양그리기 (0) | 2011.06.13 |
| 과제 #1 입출력,연산자 (0) | 2011.06.13 |
| 음수의 표현 (0) | 2011.06.13 |
| 문자열 조작함수 직접 구현하기 (2) | 2011.04.29 |
| 라인 입출력 함수 (0) | 2011.03.27 |
설정
트랙백
댓글
글
음수의 표현
언어로그/C/C++
2011. 6. 13. 22:53
컴퓨터에서는 모든 데이터들이 이진수로 표현된다. 어떻게 데이터들이 표현되는지 아는 것은
때로는 효율적인, 때로는 효과적으로 프로그래밍하기 위해 필수적인 요소이다.
문제가 발생하는 몇 가지 다른 음수의 비트 표현에 대해서 알아보자.
때로는 효율적인, 때로는 효과적으로 프로그래밍하기 위해 필수적인 요소이다.
문제가 발생하는 몇 가지 다른 음수의 비트 표현에 대해서 알아보자.
부호화 비트 표현법
가장 단순하게 음수를 표현하는 방법으로부호화비트 표현법이 있다. 가장 상위 비트를 부호비트로 표현하여
부호비트가 0이면 양수, 1이면 음수로 표현하는 방법이다. 하지만 두 수를 연산하는데 문제가 생기게 되는데...
4비트로 수를 표현하되 첫번째 비트가 부호비트라고 가정해보자
+ 5 => 0101
- 5 => 1101 (부호화 비트 표현)
와 같이 +5는 0101, -5는 부호비트만 바꾼 1010 으로 표현이 된다.
하지만 두 값을 더한 값은 0이 되야 하지만 결과는 0010 (2)가 되어 잘못된 결과가 나오게 된다.
1의 보수 표현법
그래서 다른 이진수 음수 표현법이 필요하게 됐고, 1의 보수표현법, 2의 보수표현법이 생겨나게 됐다.
1의 보수표현법은 음수를, 절대값의 이진수 표현에서 각 비트를 역전 시킨 값을 음수로 나타낸다.
+ 5 => 0101
- 5 => 1010 (1의 보수 표현 )
두 값 0101과 1010을 더하면 결과는 1111 이 나온다. 음수를 1의 보수로 변경했기 때문에
다시 결과를 1의 보수로로 취해주면 결과는 0000이 되어 올바른 결과가 나온다.
2의 보수 표현법
그럼 2의 보수 표현법을 알아보자. 2의 보수 표현법은 1의 보수표현법에 1을 더한 값이다
+ 5 => 0101
- 5 => 1011 (2의 보수 표현)
두 값 0101 과 1011 을 더하면 10000이 나오고, 4비트 표현이기 때문에 최상위 1비트를 버리면,
결과가 0으로 올바른 값이 나온다.
2의 보수표현법은 1의 보수 표현법보다 속도가 더 빠르기 때문에 (총 n비트라면 1의 보수표현법은 2n번의 비트 역전을,
2의 보수표현법은 1n + 1 번의 비트 역전을 수행한다.) 컴퓨터에서 음수를 표현하기 위해 2의 보수표현법이 선택되었다.
'언어로그 > C/C++' 카테고리의 다른 글
| 과제 #2 제어문/선택문을 이용해 다양한 모양그리기 (0) | 2011.06.13 |
|---|---|
| 과제 #1 입출력,연산자 (0) | 2011.06.13 |
| 음수의 표현 (0) | 2011.06.13 |
| 문자열 조작함수 직접 구현하기 (2) | 2011.04.29 |
| 라인 입출력 함수 (0) | 2011.03.27 |
| 배열의 이해 (0) | 2011.03.27 |
설정
트랙백
댓글
글
문자열 조작함수 직접 구현하기
언어로그/C/C++
2011. 4. 29. 14:41
API를 이해하기 위한 가장 좋은 방법 중 하나는 직접 구현해보는 것이다
string.h 에서 지원하는 문자열 조작 함수들을 직접 구현해보았다. 이 함수들은 이름에 'str' 이라는 접두어를
string.h 에서 지원하는 문자열 조작 함수들을 직접 구현해보았다. 이 함수들은 이름에 'str' 이라는 접두어를
가지고 있는데 직접 구현한 버전에는 "my_" 라는 접두어를 붙혔다.
1. 문자열 함수들의 프로토 선언과 기능
- // 문자열 s의 길이를 반환하는 함수
int strlen(char *s);
// s에 문자열 t를 복사하는 함수- void strcpy(char *s, char *t);
- // 두 문자열을 비교하는 함수 : 같으면 0, 앞문자열이 크면 양수, 작으면 음수반환
- int strcmp(char *s, char *t);
// 문자열 dest의 끝에 src 문자열을 연결하는 함수
- char *strcat(char *dest, const char *src)
- // 문자열 string에서 문자 c를 찾아 위치를 반환하는 함수. 없으면 NULL 반환
- char *strchr(const char *string, int c);
- // 문자열 string의 끝에서부터 문자 c를 찾아 위치를 반환하는 함수. 없으면 NULL 반환
- char *strrchr(const char *string, int c);
- // 문자열 string에서 문자열 strSearch를 찾아 첫번째 위치를 반환. 없으면 NULL 반환
- char *strstr(const char *string, const char *strSearch);
- // 문자열 string에서 strCharSet문자열에 속한 문자가 발견되면 그 위치를 반환. 없으면 NULL 반환
- char *strpbrk(const char *string, const char *strCharSet);
- // 문자열 str에서 delims 문자열에 속한 문자를 구분자로 분리해주는 함수. 첫번째 호출후
- // NULL 을 주어 호출하면, 기존 문자열에서 계속 구분자를 기준으로 분리해서 반환해줌// 원 문자열을 변경하기 때문에 원치않다면 원문자열의 복사본을 사용해야 한다.
- char *strtok(char *str, const char *delims);
2. 문자열 조작 함수의 구현
#include <stdio.h>
#include <string.h>
int my_strlen(char *s);
void my_strcpy(char *s, char *t);
int my_strcmp(char *s, char *t);
char *my_strcat(char *dest, const char *src);
char *my_strncat(char *dest, const char *src,size_t count);
char *my_strchr(const char *string, int c);
char *my_strrchr(const char *string, int c);
char *my_strstr(const char *string, const char *strSearch);
char *my_strpbrk(const char *string, const char *strCharSet);
char *my_strtok(char *str, const char *delims);
int main (int argc, char const* argv[])
{
char dest[1024] = "nice to meet you!";
char *test = "my name is kimsungbae! what's up?";
char *token;
printf("strchr : %s \n", strchr(test, '!'));
printf("my_strchr: %s \n", my_strchr(test, '!'));
printf("\n");
printf("strrchr : %s \n", strrchr(test, '\''));
printf("my_strrchr: %s \n", my_strchr(test, '\''));
printf("\n");
printf("strstr : %s \n", strstr(test, "is"));
printf("my_strstr: %s \n", my_strstr(test, "is"));
printf("\n");
printf("my_strcat : %s \n", my_strcat(dest, test));
printf("my_strncat: %s \n", my_strncat(dest, "@@@@@@@@", 2));
printf("\n");
printf("strpbrk : %s \n", strpbrk(test, "?!\'"));
printf("my_strpbrk : %s \n", my_strpbrk(test, "?!\'"));
token = my_strtok(dest, " ");
printf("%s \n", token);
while ((token = my_strtok(NULL, " ")) != NULL) {
printf("%s \n", token);
}
return 0;
}
int my_strlen(char *s) {
char *p = s;
while (*p++ != '\0');
return p - s;
}
void my_strcpy(char *s, char *t) {
while (*s++ = *t++) ;
}
int my_strcmp(char *s, char *t) {
for (; *s == *t; s++, t++) {
if (*s == '\0') {
return 0;
}
}
return *s - *t;
}
char *my_strcat(char *dest, const char *src) {
char *p_dest = dest;
while (*p_dest != '\0') {
p_dest++;
}
while (*src != '\0') {
*p_dest++ = *src++;
}
*p_dest = '\0';
return dest;
}
char *my_strncat(char *dest, const char *src,size_t count) {
char *p_dest = dest;
while (*p_dest != '\0') {
p_dest++;
}
while (*src != '\0' && count > 0) {
*p_dest++ = *src++;
count--;
}
*p_dest = '\0';
return dest;
}
char *my_strchr(const char *str, int c) {
while (*str != '\0') {
if (*str == c) {
return str;
}
str++;
}
return NULL;
}
char *my_strrchr(const char *str, int c) {
char *p_str = str + strlen(str) - 1;
while (p_str > str) {
if (*p_str == c) {
return p_str;
}
p_str--;
}
return NULL;
}
char *my_strstr(const char *str, const char *search) {
char *start = NULL;
while (*str != '\0') {
if (start != NULL && *search == '\0') {
break;
}
if (start != NULL && *str != *search) {
start = NULL;
}
if (start == NULL && *str == *search) {
start = str;
}
if (start != NULL && *str == *search) {
search++;
}
str++;
}
return (start != NULL) ? start : NULL;
}
char *my_strpbrk(const char *str, const char *charset) {
char *p_char;
while (*str != '\0') {
p_char = charset;
while (*p_char != '\0') {
if (*str == *p_char++) {
return str;
}
}
str++;
}
return NULL;
}
char *my_strtok(char *str, const char *delims) {
static char *tmp, *pstart;
char *p_delims;
if (str != NULL) {
tmp = str;
}
if (*tmp == '\0') {
return NULL;
}
pstart = tmp;
while (*tmp != '\0') {
p_delims = delims;
while (*p_delims != '\0') {
if (*tmp == *p_delims++) {
*tmp++ = '\0';
return pstart;
}
}
tmp++;
}
return pstart;
}
#include <string.h>
int my_strlen(char *s);
void my_strcpy(char *s, char *t);
int my_strcmp(char *s, char *t);
char *my_strcat(char *dest, const char *src);
char *my_strncat(char *dest, const char *src,size_t count);
char *my_strchr(const char *string, int c);
char *my_strrchr(const char *string, int c);
char *my_strstr(const char *string, const char *strSearch);
char *my_strpbrk(const char *string, const char *strCharSet);
char *my_strtok(char *str, const char *delims);
int main (int argc, char const* argv[])
{
char dest[1024] = "nice to meet you!";
char *test = "my name is kimsungbae! what's up?";
char *token;
printf("strchr : %s \n", strchr(test, '!'));
printf("my_strchr: %s \n", my_strchr(test, '!'));
printf("\n");
printf("strrchr : %s \n", strrchr(test, '\''));
printf("my_strrchr: %s \n", my_strchr(test, '\''));
printf("\n");
printf("strstr : %s \n", strstr(test, "is"));
printf("my_strstr: %s \n", my_strstr(test, "is"));
printf("\n");
printf("my_strcat : %s \n", my_strcat(dest, test));
printf("my_strncat: %s \n", my_strncat(dest, "@@@@@@@@", 2));
printf("\n");
printf("strpbrk : %s \n", strpbrk(test, "?!\'"));
printf("my_strpbrk : %s \n", my_strpbrk(test, "?!\'"));
token = my_strtok(dest, " ");
printf("%s \n", token);
while ((token = my_strtok(NULL, " ")) != NULL) {
printf("%s \n", token);
}
return 0;
}
int my_strlen(char *s) {
char *p = s;
while (*p++ != '\0');
return p - s;
}
void my_strcpy(char *s, char *t) {
while (*s++ = *t++) ;
}
int my_strcmp(char *s, char *t) {
for (; *s == *t; s++, t++) {
if (*s == '\0') {
return 0;
}
}
return *s - *t;
}
char *my_strcat(char *dest, const char *src) {
char *p_dest = dest;
while (*p_dest != '\0') {
p_dest++;
}
while (*src != '\0') {
*p_dest++ = *src++;
}
*p_dest = '\0';
return dest;
}
char *my_strncat(char *dest, const char *src,size_t count) {
char *p_dest = dest;
while (*p_dest != '\0') {
p_dest++;
}
while (*src != '\0' && count > 0) {
*p_dest++ = *src++;
count--;
}
*p_dest = '\0';
return dest;
}
char *my_strchr(const char *str, int c) {
while (*str != '\0') {
if (*str == c) {
return str;
}
str++;
}
return NULL;
}
char *my_strrchr(const char *str, int c) {
char *p_str = str + strlen(str) - 1;
while (p_str > str) {
if (*p_str == c) {
return p_str;
}
p_str--;
}
return NULL;
}
char *my_strstr(const char *str, const char *search) {
char *start = NULL;
while (*str != '\0') {
if (start != NULL && *search == '\0') {
break;
}
if (start != NULL && *str != *search) {
start = NULL;
}
if (start == NULL && *str == *search) {
start = str;
}
if (start != NULL && *str == *search) {
search++;
}
str++;
}
return (start != NULL) ? start : NULL;
}
char *my_strpbrk(const char *str, const char *charset) {
char *p_char;
while (*str != '\0') {
p_char = charset;
while (*p_char != '\0') {
if (*str == *p_char++) {
return str;
}
}
str++;
}
return NULL;
}
char *my_strtok(char *str, const char *delims) {
static char *tmp, *pstart;
char *p_delims;
if (str != NULL) {
tmp = str;
}
if (*tmp == '\0') {
return NULL;
}
pstart = tmp;
while (*tmp != '\0') {
p_delims = delims;
while (*p_delims != '\0') {
if (*tmp == *p_delims++) {
*tmp++ = '\0';
return pstart;
}
}
tmp++;
}
return pstart;
}
'언어로그 > C/C++' 카테고리의 다른 글
| 과제 #1 입출력,연산자 (0) | 2011.06.13 |
|---|---|
| 음수의 표현 (0) | 2011.06.13 |
| 문자열 조작함수 직접 구현하기 (2) | 2011.04.29 |
| 라인 입출력 함수 (0) | 2011.03.27 |
| 배열의 이해 (0) | 2011.03.27 |
| 기억부류(Storage Class) / 변수 (0) | 2011.03.27 |
c함수,
strcat,
strchr,
strcmp,
strcpy,
string,
strlen,
strpbrk,
strrchr,
strstr,
strtok,
문자열,
문자열 조작,
함수
설정
트랙백
댓글
글
라인 입출력 함수
언어로그/C/C++
2011. 3. 27. 21:07
라인단위로 입출력을 다루는 함수들에 대해서 알아보자. 널문자를 삽입해주는지 여부와 버퍼에서 개행문자를
제거하는지 여부에 주목하여 보자.
제거하는지 여부에 주목하여 보자.
scanf(const char *TEMPLATE, ...)
scanf 함수를 사용하여, 한 라인의 문자열을 읽을 수 있지만, 개행문자를 표준입력버퍼에 남겨놓는다.
연이은 읽기 동작에 오동작을 초래할 수 있기때문에, 입력버퍼에서 개행문자를 제거하는 것을 잊지 말자!
char* fgets(char *S, int COUNT, FILE *STREAM)
지정한 입력버퍼에서 최대 COUNT-1 개의 문자를 읽되, 엔터를 칠때까지 배열 S에 저장하는 함수이다.
배열의 공간이 충분하다면, 개행문자와 함께 널문자를 삽입한다. (엔터에 의해 종료)
하지만 공간이 충분하지 않다면, COUNT-1개의 문자와 널문자를 삽입하고 종료한다. (사이즈 제약의 의해 종료)
int fputs(const char *S, FILE *STREAM)
버퍼 S의 내용을 지정한 출력버퍼에 출력하는 함수로, 널문자를 개행문자로 변환하지 않는다.
fgets와 fputs 보다는 덜 사용되지만 라인단위로 입출력을 할 수 있는 다음과 같은 함수가 있다.
char* gets(char *S)
표준 입력버퍼에서 개행문자를 만날 때까지 읽는 함수로, 개행문자는 S에 저장하지 않지만, 입력퍼버에서는 제거한다
int puts(const char *S)
S 문자열을 표준출력버퍼에 출력하는 함수로 널문자를 만나면 개행문자로 변환하여 출력한다.
'언어로그 > C/C++' 카테고리의 다른 글
| 음수의 표현 (0) | 2011.06.13 |
|---|---|
| 문자열 조작함수 직접 구현하기 (2) | 2011.04.29 |
| 라인 입출력 함수 (0) | 2011.03.27 |
| 배열의 이해 (0) | 2011.03.27 |
| 기억부류(Storage Class) / 변수 (0) | 2011.03.27 |
| 전역변수와 지역변수 (0) | 2011.03.27 |
설정
트랙백
댓글
글
배열의 이해
언어로그/C/C++
2011. 3. 27. 20:53
1. 배열이란?
프로그램이 필요한 이유 중의 하나는 많은 양의 데이터를 처리하기 위해서이다.
그중에서도 동일한 형태를 갖는 다수의 데이터를 다루기 위해 배열을 사용할 수 있다. 배열은 연속적인 메모리 공간에
할당된 동일한 데이터 타입을 갖는 변수들의 묶음이다.
할당된 동일한 데이터 타입을 갖는 변수들의 묶음이다.
int array[3];
위와 같은 선언은 4바이트의 메모리가 연속적으로 3개가 할당되어 총 12바이트의 메모리가 생성된다.
이 때 array 라는 배열의 식별자에는 할당된 메모리의 시작주소가 할당된다. 즉 포인터 상수이다.
이렇게 할당된 메모리 공간에 배열의 식별자를 사용하여 접근할 수 있다.
배열의 첨자를 사용하여 접근하는 방법
scanf("%d %d %d \n", &array[0], &array[1], &array[2] );배열 식별자(포인터 상수)를 사용하여 접근하는 방법
scanf("%d %d %d \n", array, array + 1, array + 2 );
2. 배열의 초기화
배열 또한 일반적인 변수와 동일한 초기화 규칙을 따른다. 지역변수로 선언된 배열은 기본으로 쓰레기값으로 초기화되며,
전역변수로 선언된 경우는 0으로 초기화 된다. 배열의 선언과 초기화를 다음과 같이 할 수 있다.
int array[3] = { 10 , 20, 30 }; // 명시적으로 요소의 개수와 각 초기값을 설정
int array[] = { 10, 20 , 30 }; // 초기값의 수에 따라 요소의 수가 결정됨
int array[3] = { 10 }; // 첫요소만 10으로, 나머지는 0 으로 초기화됨
int array[3] = { 0 }; // 모든 요소를 0으로 초기화
특히 마지막 문장은 다수의 요소를 갖는 배열을 초기화 할 때 유용한 구문이다.
int array[100] = { 0 };
'언어로그 > C/C++' 카테고리의 다른 글
| 문자열 조작함수 직접 구현하기 (2) | 2011.04.29 |
|---|---|
| 라인 입출력 함수 (0) | 2011.03.27 |
| 배열의 이해 (0) | 2011.03.27 |
| 기억부류(Storage Class) / 변수 (0) | 2011.03.27 |
| 전역변수와 지역변수 (0) | 2011.03.27 |
| 함수의 이해 (0) | 2011.03.27 |
설정
트랙백
댓글
글
기억부류(Storage Class) / 변수
언어로그/C/C++
2011. 3. 27. 20:40
데이터, 스택, 힙 영역
추상적인 분류이지만 프로그램을 위한 메모리 공간은 크게 데이터영역, 스택(Stack)영역, 힙(Heap)영역으로 나뉜다.
데이터 영역에는 전역(Global)변수와 정적(Static) 변수에게 할당되는 메모리 공간으로 프로그램 시작부터 끝나는 시점까지
존재하는 메모리 영역이다. 스택영역은 블럭 또는 함수 Scope 에 할당되는 메모리 공간이며, 제어흐름이 활성화 되었을 때
생성된다. 힙 영역은 프로그램이 유동적으로 사용할 수 있는 메모리 공간으로, 프로그래머가 해당 메모리를 필요한 만큼
사용하고 난 뒤 메모리를 해제해야 한다.
사용하고 난 뒤 메모리를 해제해야 한다.
레지스터 변수, 정적변수
변수의 타입 앞에 register 라는 키워드를 사용하여, 레지스터 변수를 선언할 수 있다. 레지스터 변수는 CPU의 메모리가 아닌
레지스터에 데이터를 저장하여, 데이터 접근 속도를 향상시킨다. 하지만 register 키워드를 사용했다고 무조건 레지스터에
데이터를 저장하는 것은 아닌다. 일반적으로 CPU에 존재하는 30여 가지의 레지스터 중 1~2 개의 레지스터가 남는데, 이
레지스터들이 사용되고 있지 않을 경우에 사용되며, 그렇지 않을 경우 메모리에 할당된다.
register int i, j; // 레지스터에 i, j 생성을 요청.
정적(Static) 변수는 전역변수와 같이 메모리의 데이터 영역에 생성이 된다. 지역 정적변수는 함수가 종료된 후에도
그 값을 사용하고 싶을 경우에 쓰인다. 함수 내부에 선언된 지역정적 변수는 함수 호출시점에 최초로 생성이 되며,
이후 메모리 데이터 영역에 프로그램 종료시점까지 유지가 된다.
void func()
{
static int i = 0; // 연이은 호출에도 처음 생성된 i가 사용됨.
i++;
}
'언어로그 > C/C++' 카테고리의 다른 글
| 라인 입출력 함수 (0) | 2011.03.27 |
|---|---|
| 배열의 이해 (0) | 2011.03.27 |
| 기억부류(Storage Class) / 변수 (0) | 2011.03.27 |
| 전역변수와 지역변수 (0) | 2011.03.27 |
| 함수의 이해 (0) | 2011.03.27 |
| 포인터의 이해 (0) | 2011.03.11 |
설정
트랙백
댓글
글
전역변수와 지역변수
언어로그/C/C++
2011. 3. 27. 20:15
1. 지역변수(local variable)
지역변수는 변수가 선언된 블럭(Scope) 내부에서만 유효한 변수이다. 지역변수는 제어흐름이 해당 블럭에
진입되는 시점에 생성되고 , 블럭을 빠져나가는 순간 소멸되는데 흔히 자동변수라 하여 auto라는 키워드가 붙지만,
디폴트로 생략할 수 있다. 또한 동일한 범위(Scope) 내 있는 코드에서만 접근할 수 있으며 생성 시, 의미없는 값이
들어가 있기 때문에 사용전에 반드시 초기화를 해야한다.
2. 전역변수(global variable)
전역변수는 프로그램 실행타입 내내 유효한 변수이다. main함수가 호출되기 전에 생성되어, 프로그램 종료시 메모리가
회수된다. 프로그램 어떤 영역에서도 접근할 수 있는 특징이 있으며, 생성시 자동으로 0으로 초기화가 이루어진다.
3. 지역변수와 전역변수는 어떻게 사용해야하나?
전역변수는 어떤영역에서도 데이터에 접근할 수 있기 때문에 데이터 공유에 유용하다. 하지만 프로그램 실행타임
동안 계속 사용되기 때문에 과하게 사용하면 메모리에 낭비를 가져온다. 또한 전역변수에 대한 변경은 그 변수를
사용하는 모든 함수에 파급효과를 미쳐서 강한 결합(tight coupling)의 겨로가를 가져온다. 그렇기 때문에 프로그램을
용이하게 하는 범위에서 최소한으로 사용하고, 그 외의 경우는 지역변수를 사용하는 것이 좋다.
'언어로그 > C/C++' 카테고리의 다른 글
| 배열의 이해 (0) | 2011.03.27 |
|---|---|
| 기억부류(Storage Class) / 변수 (0) | 2011.03.27 |
| 전역변수와 지역변수 (0) | 2011.03.27 |
| 함수의 이해 (0) | 2011.03.27 |
| 포인터의 이해 (0) | 2011.03.11 |
| 매크로, 연산자 (3) | 2011.03.10 |
설정
트랙백
댓글
글
함수의 이해
언어로그/C/C++
2011. 3. 27. 20:10
함수가 필요한 이유?
중복된 작업을 함수로 분리하면, 한번 작성으로 여러번 사용할 수 있어서 효율적인 프로그램이 된다.
또한 큰 문제를 작은 문제들로 나누어 이해하기 쉬워지며, 수정사항이 발생하면 함수 부분만 수정하면
되기 때문에 유지보수도 용이해진다.
함수의 원형(프로토타입)과 정의
C언어에서 함수는 원형(프로토타입)과 정의로 분리된다. 함수의 원형(프로토타입)은 보통 헤더파일이나
메인함수 이전에 선언이 되며, 컴파일러에게 이러 이러한 함수를 아래에 정의했으니까 메인함수 또는 특정함수에서
이 함수를 사용해도 됨을 알려주는 것이다.
함수의 정의는 실제적으로 함수가 하는 일을 기술하는 부분이다. C언어에서는 함수의 시그니처로 함수의 이름만을
사용하기 때문에, 파라미터의 타입과 반환값의 타입이 달라도 동일한 이름의 함수를 사용 할 수 없다.
#include <stdio.h>
void swap(int , int);// 함수원형(프로토타입)
int main() {
...
return 0;
}
void swap(int a, int b) { // 함수의 정의
...
}
Call By Value vs Call By Reference
함수 호출시 파라미터를 넘기는 방식에 따라 Call By Value 또는 Call By Reference 라고 구분한다.
함수 호출시 변수들의 데이터(값)가 복사되는데, 함수 내에서 이 복사된 변수에 대한 조작은 원본 변수에
에 아무런 영향을 미치지 못하는데 이러한 호출방식을 Call By Value라고 부른다.
파라미터로 변수의 주소를 넘기면, 피호출자 쪽에서는 이 주소를 조작하여 원본 변수의 데이터를 변경 할
수 있다. 이러한 호출방식을 Call By Pointer 또는 Call By Reference 라고 부른다.
#include <stdio.h>
main() {
int a = 1, b = 5;
swap(a, b);// 변수의 값을 전달함
}
void swap(int a, int b) {// main함수의 a, b는 변경되지 않음
int temp = a;
a = b;
b = temp
}
Call By Reference
#include <stdio.h>
main() {
int a = 1, b = 5;
swap(&a, &b);// 변수의 주소를 전달함
}
void swap(int *a, int *b) { // main함수의 a, b가 변경됨
int temp = *a;
*a = *b;
*b = temp;
}
'언어로그 > C/C++' 카테고리의 다른 글
| 기억부류(Storage Class) / 변수 (0) | 2011.03.27 |
|---|---|
| 전역변수와 지역변수 (0) | 2011.03.27 |
| 함수의 이해 (0) | 2011.03.27 |
| 포인터의 이해 (0) | 2011.03.11 |
| 매크로, 연산자 (3) | 2011.03.10 |
| 표준입출력함수 getchar() / putchar() (0) | 2011.02.22 |
1_empty_year.c