2. 문자포인터와 정수 포인터

    반응형

    1. 문자 포인터

    c언어에서 문자포인터는 선언은 *을 붙히지만 포인터변수에 값을 저장 할때 &를 안붙혀도 된다.

    문자배열 자체가 포인터 이기 때문이다. 포인터변수=문자배열대표값

     

    아래 코드를 참조

    #define _CRT_SECURE_NO_WARNINGS //비쥬얼 스튜디오에서 strcpy를 쓰려면 붙혀줘야함
    #include <stdio.h>
    #include <string.h>
    
    void main(void)
    {
    	//문자 포인터 배열
    	char ochar[] = "Korea";
    	char ochar2[5+1] = "China"; //5글자를 입력하려면 글자 총 길이에 +1을 해줘야함
    	char* pchar;
    
    	pchar = ochar; //&를 안붙혀줘도 된다.
    
    
    	puts(ochar);		// "Korea"
    	puts(pchar);		// "Korea"
    
    	strcpy(pchar, "Japan");
    
    
    	puts(ochar);		// "Japan"
    	puts(pchar);		// "Japan"
    
    	memcpy(ochar, ochar2, sizeof(ochar2));
    	// 
    	//아래와 같이 써도 된다.
    	//memcpy(ochar, ochar2, sizeof(char)*5); //china가 5바이트 이므로 길이에 5를 넣어줬다.
    	//memcpy(ochar, ochar2, (strlen(ochar2))); //strlen으로 스트링의 길이를 넣어줬다.
    	//strcpy(ochar, ochar2);  //단순 스트링 카피
    	//strncpy(ochar, ochar2, strlen(ochar2));  //단순 스트링 카피
    
    	printf("ochar 배열마지막 %p \n", ochar[5]); //마지막 배열의 주소는 0인 것을 볼수 있다.
    
    	puts(ochar);		// "Japan"
    	puts(ochar2);		// "Japan"
    	puts(pchar);		// "Japan"
    }

    결과값

    Korea
    Korea
    Japan
    Japan
    China
    China

     

    2. 숫자 포인터

    정수 포인터는 포인터 변수에 값을 넣을 때 주소를 넣어줘야 하므로 &를 붙혀야 한다.

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <string.h>
    
    void main(void)
    {
    	//정수 포인터 배열
    	int oint=100;
    	int* pint;
    
    	pint = &oint; //포인터 변수에 주소 값 
    	//문자배열과는 달리 포인터와 정수배열은 같지 않음
    
    	printf("oint: %d \n", oint); //처음 넣었던 100이 나옴
    	printf("pint: %d \n", *pint); // pint를 &oint로 연결 시켰으므로 100 나옴
    	printf("pint: %p \n", pint); //pint의 주소값 출력
    
    
    	//pint = 200;  //pint는 포인터 정수변수이므로 *를 붙혀줘야함
    	*pint = 200; 
    	//pint[0] = 200; //포인터변수는 배열이므로 이형태로 써도됨
    
    
    	printf("oint 두번째: %d \n", oint);
    	printf("pint 두번째: %d \n", *pint);
    	printf("pint 두번째: %p \n", pint);
    }

     

    위에서는 숫자를 대입할 때 * pint를 썼는데 숫자형은 memcpy로 대입할 수도 있다.

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <string.h>
    
    void main(void)
    {
    	//정수 포인터 배열
    	int oint = 100;
    	int* pint;
    	int oint2 = 300;
    
    	pint = &oint; //포인터 변수에 주소 값 
    	//문자배열과는 달리 포인터와 정수배열은 같지 않음. 따라서 &를 붙혀줘야함
    
    	printf("oint: %d \n", oint); //처음 넣었던 100이 나옴
    	printf("pint: %d \n", *pint); // pint를 &oint로 연결 시켰으므로 100 나옴
    	printf("pint: %p \n", pint); //pint의 주소값 출력
    
    	/* pint에 값을 대입할땐 아래와 같은 형식 사용 가능 */
    	*pint = 200;
    	//pint = 200; XX 이렇게 쓰면안됨  //pint는 포인터 정수변수이므로 *를 붙혀줘야함
    	//*pint = oint2; 정수로 직접 써도 되고 값을 넣어도 됨
    	
    	//pint[0] = 200; //포인터변수는 배열이므로 이형태로 써도됨
    	
    	//memcpy로 써도 됨
    	//memcpy(&oint, &oint2, sizeof(int)); //정수 변수는 값이 주소에서 꺼내온 것이므로 &를 붙혀줘야함 반면 문자 변수는 &를 안붙혀줘도됨
    
    	/****************************************************/
    
    	printf("oint 두번째: %d \n", oint);
    	printf("pint 두번째: %d \n", *pint);
    	printf("pint 두번째: %p \n", pint);
    	printf("sizeof(int): %d \n", sizeof(int));
    }

    결과값

    oint: 100
    pint: 100
    pint: 000000111C70F4E4
    oint 두번째: 200
    pint 두번째: 200
    pint 두번째: 000000111C70F4E4
    sizeof(int): 4

     

    반응형

    댓글