딩굴댕굴

C 16Day (20160128)

by jennysgap

BOX

배열 (널 문자가 필요한 이유) 예제

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;    앞에 &(엔퍼센트)를 입력하면 num의 주소값을 나타냄. *(에스크립터)
    int * ptr = &num;        //변수를 선언하는 동시에 초기화
 
    *ptr=20;                //*ptr 포인터 변수가 가리키는 공간
 
    printf("%d\n", num);
 
    return 0;
}
cs

*ptr = ??    ptr이 가리키고 있는 공간

ptr = ??    ptr에다가 뭘 저장할 거니? (int형의 변수 주소값)


int * ptr = &num;        변수를 선언하는 동시에 초기화

int * ptr;

ptr=&num;






포인터

정의

  • 포인터는 메모리 번지의 주소
  • 주기억장치의 특정 주소를 받는 변수
  • 포인터 변수의 크기는 자료형에 관계없이 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










20160128 c언어 16day.txt






반응형

'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

활동하기