본문 바로가기
코스웨어/16년 스마트컨트롤러

2016-04-06-조재찬_업무일지_포인터 및 함수

by 알 수 없는 사용자 2016. 4. 15.
728x90
반응형

배열


2차원에서 가로의 크기는 정해줘야 함






이중 포인터와 다중포인터



 PPP 

 PP

 P

  num A=100

 int***

  int**

 int*

  int


 



 대상의 type 

 자기자신의 type 

 int  

 (포인터)

     


 가리키는 대상

 포인터

 PP 

 *PPP

 

  **PPP

 B    

  ***PPP




 int * whoA[4]={&num1, &num2, &num3, &num4};  // 포인터 배열이고 16byte

 int (*whoB)[4]=arr2d;                                        // 배열 포인터이고 4byte




이중 포인터 예제


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>

int main(void)
{
    double num = 3.14;
    double *ptr = &num;
    double **dptr = &ptr;
    double *ptr2;

    printf("%9p %9p \n", ptr, *dptr);
    printf("%9p %9p \n", num, **dptr);
    ptr2 = *dptr;
    *ptr2 = 10.99;
    printf("%9g %9g \n", num, **dptr);
 
    return 0;
}



Output:

1
2
3
0xffb30790 0xffb30790 
0x51eb851f 0x40091eb8 
    10.99     10.99 






포인터 변수에 const 선언 // const를 붙이면 해당 변수를 상수로 취급하게 된다.

#include <stdio.h>

int main()
{
    char *P1="TEST";
    const char *P2="TEST";
    char const *P3="TEST";
    char * const P4="TEST";
    const char * const P5="TEST";
    char const * const P6="TEST";

    printf("P1=[%s], [%p]\n", P1, P1);
    printf("P2=[%s], [%p]\n", P2, P2);
    printf("P3=[%s], [%p]\n", P3, P3);
    printf("P4=[%s], [%p]\n", P4, P4);
    printf("P5=[%s], [%p]\n", P5, P5);
    printf("P6=[%s], [%p]\n", P6, P6);

    printf(P1="zest\n");
    printf(P1="zest\n");
    printf(P1="zest\n");
   
    //printf(P4=zest);
    //printf(P5=zest);
    //printf(P6=zest);
    return 0;
}



리눅스에서는 주소가 모두 같게 나온다.

Output:

1
2
3
4
5
6
7
8
9
P1=[TEST], [0x8048698]
P2=[TEST], [0x8048698]
P3=[TEST], [0x8048698]
P4=[TEST], [0x8048698]
P5=[TEST], [0x8048698]
P6=[TEST], [0x8048698]
zest
zest
zest





메인 함수를 통한 인자 전달 // gcc 흉내내기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

#include <stdio.h> int main(int argc, char *argv[]) // argc = 지정해준 명령행 인자의 개수 저장, argv = 문자열 배열 포인터 { int i=0; if(1==argc) { printf("gcc: fatal error: no input files \n"); return 0; } printf("전달 문자열 수: %d \n", argc); for(i=0; i<argc; i++) printf("%d번째 문자열: %s \n", i+1, argv[i]); return 0; }


전달된 문자열이 하나이므로 조건에 맞는 아래 문장이 출력된다.


Output:

1
gcc: fatal error: no input files 






EOF (End Of File) // 파일의 끝


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

int main()
{
    int ch;

    while(1)
    {
        ch=getchar(); 
        if(ch==EOF)  
            break;
        putchar(ch); 
    }
        return 0;
}


getchar를 통해 입력버퍼의 문자를 읽어들임

enter가 입력될때까지 키보드 입력값들을 계속해서 버퍼에 저장. enter가 파일의 끝이 된다.






fprintf 함수 //  특정한 스트림에 일련의 데이터를 특정한 형식에 맞추어 쓰게 된다.   리눅스 man 3 fprintf 참조

1
2
3
4
5
6
7
#include <stdio.h>

int main()
{
    fprintf(stdout, "test \n");
    return 0;
}


stdout(표준출력)을 통해 test라는 글자가 출력.

printf 함수가 실제로 출력하는 것이 없고 fprintf에 지시해서 출력하는 것이라고 할 수 있다.


Output:

1
test 


728x90