일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Visual Micro
- priority_queue
- 운영체제
- list
- 컴퓨터 그래픽스
- 자료구조
- 시스템프로그래밍
- WinAPI
- 수광 소자
- Array
- 아두이노 컴파일러
- set
- Algorithm
- c++
- C언어
- vector
- queue
- stl
- directx
- 통계학
- Stack
- 아두이노 소스
- html
- map
- arduino compiler
- 아두이노
- LineTracer
- Arduino
- 라인트레이서
- Deque
- Today
- Total
Kim's Programming
C언어 - 포인터(Pointer)(3/3) 본문
::env
1 2 3 4 5 6 7 8 9 10 11 12 | #include<stdio.h> void main(int argc, char *argv[],char *env[]) { int i = 0; printf("전달된 인수의 개수 = %d\n", argc); for (i = 0; i < argc; i++) { printf("%d번째 인수 = %s\n", i, argv[i]); } } | cs |
전달된 인수의 개수를 보여주고 입력 된 인수들을 순서대로 출력하였습니다. 또 다른 것으로 인수를 받아 작동하는 계산기를 만들어보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #include<stdio.h> #include<Windows.h> void main(int argc, char *argv[]) { int num_1, num_2, result; char op; if (argc != 4) { printf("인수가 부족합니다. 다시 입력해주세요\n"); exit(0); } num_1 = atoi(argv[1]); num_2 = atoi(argv[3]); op = atoi(argv[2]); switch (op) { case '+': result = num_1 + num_2; break; case '-': result = num_1 + num_2; break; case'*': result = num_1 *num_2; break; case'/': result = num_1 / num_2; break; default: printf("사칙 연산으로 입력해 주세요\n"); exit(0); } printf("결과 값 = %d", result); } | cs |
다음 소스를 실행 시키면 다음과 같습니다. 인수를 넣어줄때는 인수마다 띄어서 입력하여야합니다. 띄어주지 않으면 전체를 하나의 인수로 인식되어 정상적으로 작동 하지 않습니다.
인수가 4개가 아니거나 사칙연산이 아닌경우는 종료하도록 하였습니다. 일수가 4개일 경우엔 argv[1]과 argv[3]에 전달된 피연산자들을 구해서 num_1변수와 num_2변수에 대입시킵니다. 명령행에 전달된 인수는 모두 문자열로 되있기 때문에 atoi함수를 통해서 정수로 변경시켜 줍니다. 연산자는 중간의 argv[2]로 전달이 되게 되는데 모두 한 문자로 구성되있기 때문에 argv[2]의 첫 문자만 살펴보면 됩니다. 만약 연산자가 사칙연산이외의 연산자를 이용하면 오류를 출력합니다.
동적 문자열 배열
1 2 | int len = 지정값; char name[len]; | cs |
1 2 | T *p; p=(T *)malloc(n*sizeof(T)); | cs |
1 2 3 4 5 | int len; scanf("%d",&len); char *name; name=(char *)malloc(len*sizeof(char)); free(name) | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<malloc.h> void main() { int len = 10, num = 5; char **name; name = (char**)malloc(num*sizeof(char*)); for (int i = 0; i < num; i++) { name[i] = (char *)malloc(len*sizeof(char)); } for (int i = 0; i < num; i++) { sprintf(name[i], "string %d", i); puts(name[i]); } for (int i = 0; i < num; i++) { free(name[i]); } free(name); } | cs |
1 2 | char **p; p=(char *)malloc(num*sizeof(char *)) | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include<stdio.h> void main() { void *vp; void *av[5]; void **vpp; int i, *pi=&i; vpp = &vp; //가능 vpp = av; //가능 vpp++; //가능 *vpp; //가능 vpp = π //불가능 **vpp; //불가능 } | cs |
void **로 선언된 vpp가 대입받을 수 있는 값은 void *형 변수 vp의 번지, void *배열 av의 선두 번지 등입니다. int **ppi가 int *pi의 번지나 int *ar[5]의 선두 번지를 대입받을 수 있는 것과 같은 이치입니다. av배열의 각 요소는 void * 타입이므로 임의 타입 변수에 대한 변수를 가질 수 있습니다. 따라서 av 배열 요소가 가리키는 값을 읽으려면 반드시 캐스트 연산자가 있어야 하며 ++,--연산자도 직접적으로는 적용할 수 없습니다. 하지만 vpp가 가리키는 대상체는 void *로 타입이 정해져 있고 포인터는 부호 없는 4바이트 길이를 가지므로 vpp 자체를 증가하여 av의 다음 요소로 이동할 수 있으며 *vpp로 가리키는 요소의 값(이 경우 번지값)을 읽을 수도 있습니다.
'Programming > C' 카테고리의 다른 글
C언어 - 구조체(Structure)(2/2) (23) | 2015.08.21 |
---|---|
C언어 - 구조체(Structure)(1/2) (1) | 2015.08.20 |
C언어 - 포인터(Pointer)(2/3) (1) | 2015.08.18 |
C언어 - 포인터(Pointer)(1/3) (2) | 2015.08.16 |
C언어 - 배열(Array)(2/2) (0) | 2015.08.15 |