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

 

+ Recent posts