반응형

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

 

반응형
반응형

자바스크립트에서는 console.log()라는 명령어로 콘솔을 찍고

자바에서는 System.out.println()으로 찍는다.

 

하지만 C언어는 조금다르다.

 

콘솔을 찍으려는 문자 혹은 숫자의 형태를 앞에다 써줘야한다.

 

예를 들면 

 

틀린예

#include <stdio.h>

int main()
{
	int num1 = 10;
	int num2 = 20;
	int num3 = 30;

	printf(num1); //틀린예이다. 아무것도 출력되지 않는다.
	

	return 0;
}

여기서 printf에 num1을 넣어봐도 10이 출력되지 않는다.

 

맞는 예를보면

 

맞는예

#include <stdio.h>

int main()
{
	int num1 = 10;
	int num2 = 20;
	int num3 = 30;

	printf("%d %d %d \n", num1, num2, num3);


	return 0;
}

이렇게 %d처럼 변수의 형태를 써줘야 출력이 된다.

 

%d는 %i를 써도 된다. 또한 역슬래쉬n은 줄바꾸는 표시이므로 생략해도 된다.

 

 

반응형

+ Recent posts