C 16Day (20160128)
by jennysgap배열 (널 문자가 필요한 이유) 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <stdio.h> int main(void) { char str[50]; int idx = 0; printf("문자열 입력: "); scanf("%s", str); //배열 대상일 때는 &(엔퍼센트) 입력하지 않음 printf("입력 받은 문자열: %s \n", str); printf("문자 단위 출력 : "); //while 이부분 완전 중요합니다. 대박 중요합니다.~~!!! //조건식 잘 이해하세요~ 중요합니당~ while(str[idx] != '\0') { printf("%c", str[idx]); idx++; } //=문자의 끝을 나타내는 널문자가 나타날 때까지 계속해서 사용해 주세요~ printf("\n"); } | cs |
char arr1[] = {'H', 'i', '~'};
char arr2[] = {'H', 'i', '~', '\n'};
널 문자의 유무에 따라 문자열의 판단 여부가 결정된다.
scanf는 공백을 포함한 문자를 입력 못받음
서식문자를 지정해서 입력을 받을 수 있다라는 장점이 있음
공백을 포함한 문자를 입력받으려면 gets( ); 라는 함수를 사용하면 됨
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <stdio.h> int main(void) { char str[50]; int idx = 0; printf("문자열 입력: "); gets(str); //배열 대상일 때는 &(엔퍼센트) 입력하지 않음 printf("입력 받은 문자열: %s \n", str); printf("문자 단위 출력 : "); while(str[idx] != '\0') { printf("%c", str[idx]); idx++; } printf("\n"); } | cs |
'단순히 출력만 하고 싶어'라고 할 땐 puts(); 함수 사용 (자동으로 계행 \n이 삽입되어 출력)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h> int main(void) { char str[50]; int idx = 0; printf("문자열 입력: "); gets(str); puts(str); printf("문자 단위 출력 : "); while(str[idx] != '\0') { printf("%c", str[idx]); idx++; } printf("\n"); } | cs |
배열(널 문자가 필요한 이유) 예제2
널 문자는 문장의 끝을 의미
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <stdio.h> int main(void) { char str[50] = "I like C programing"; printf("string : %s \n", str); str[8] = "\0"; printf("string : %s \n", str); str[6] = "\0"; printf("string : %s \n", str); str[1] = "\0"; printf("string : %s \n", str); return 0; } | cs |
문제
변수를 선언하고 변수는 stack에 저장, 4byte 할당 됐고, 그 값은 10임
그 메모리가 어디에 저장되어있는지 확인 할 수 있는게 주소인데요 0x0060(16진수형태로 할당)
즉, 변수가 선언되면 주소가 할당되고 그 주소를 저장하려고 한다. 그때 사용하는 함수가 포인터 변수
주소는 1byte 단위로 할당된다.
So, num은 주소 4개 할당되고 0x0060 0x0061 0x0062 0x0063
주소는 첫 번째 주소만 알려줌!
Char 주소 1개
int 주소 4개
double 주소 8개
포인터가 어려우면 작성하기 전에 먼저 그림부터 그리기!!
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdio.h> int main(void) { int num=10; //자료형 * 변수명 = # 앞에 &(엔퍼센트)를 입력하면 num의 주소값을 나타냄. *(에스크립터) int * ptr = # //변수를 선언하는 동시에 초기화 *ptr=20; //*ptr 포인터 변수가 가리키는 공간 printf("%d\n", num); return 0; } | cs |
*ptr = ?? ptr이 가리키고 있는 공간
ptr = ?? ptr에다가 뭘 저장할 거니? (int형의 변수 주소값)
int * ptr = # 변수를 선언하는 동시에 초기화
int * ptr;
ptr=#
포인터
정의
- 포인터는 메모리 번지의 주소
- 주기억장치의 특정 주소를 받는 변수
- 포인터 변수의 크기는 자료형에 관계없이 4byte의 크기를 갖는다.
왜?? 주소의 형태는 다 같기 때문에
형식
- 자료형 * 포인터변수명;
- 자료형은 포인터변수와 연결할 변수와 같은 자료형이어야 한다.
사용예
1 2 3 4 5 6 7 | #include <stdio.h> int main(void) { int a=10; //a변수 메모리 할당 int * pa; //pa변수 메모리 할당 pa = &a; //a의 주소를 pa에 저장 } | cs |
포인터 연산자 (&연산자)
- &는 메모리 주소를 출력해주는 연산자이다.
- &연산자를 이용하면 변수의 주소를 구할 수 있다.
포인터연산자 (*연산자)
- *는 주소를 이용하여 변수값을 접근하는 연산자이다.
- 포인터의 데이터 형은 주소를 저장하는 변수의 데이터 형과 일치해야 함
int * pnum1 : int * 는 int형 변수를 가리키는 pnum1의 선언을 의미함
double * pnum2 : double * 는 double형 변수를 가리키는 pnum2의 선언을 의미함
unsigned int * pnum3 : unsigned int * 는 unsigned(부호가 없는 양수만을 사용) int형 변수를 가리키는 pnum3의 선언을 의미함
int * ptr int형 포인터 변수 ptr의 선언
int* ptr int형 포인터 변수 ptr의 선언
int *ptr int형 포인터 변수 ptr의 선언
포인터 변수 선언에서 * 의 위치에 따른 차이는 없다.
포인터의 이해
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> int main(void) { int num1=100, num2=100; int * pnum; pnum = &num1; //포인터 pnum이 num1을 가리킴 (*pnum) += 30; //num1 +=30; 과 동일 pnum = &num2; //포인터 pnum이 num1을 가리킴 (*pnum) -= 30; //num1 +=30; 과 동일 printf("num1:%d, num2:%d \n", num1, num2); return 0; } | cs |
'BOX' 카테고리의 다른 글
C 18Day (20160201) (0) | 2016.02.02 |
---|---|
C 17Day (20160129) (0) | 2016.01.31 |
C 15Day (20160127) (0) | 2016.01.31 |
C 14Day (20160126) (0) | 2016.01.31 |
C 13Day (20160125) (0) | 2016.01.27 |
블로그의 정보
jennysgap
jennysgap