반응형

(알아두기)

컴퓨터는 32비트와 64비트를 많이 사용한다. 이는 1번 처리에 사용할 수 있는 메모리의 크기이다.

만약 32비트(4byte) PC라면, 8 byte를 할당해도 저장할 수 있는 공간은 4byte 뿐이다. 나머지는 애매한 크기는 낭비되는 것. 이는 하드웨어, OS, 컴파일러 스펙에 따라 다 다를 것임.

그래서 가능한 메모리공간이 많다면, 메모리는 크게 할당해주는 것이 좋다.

 

 

 

포인터는 어떤 이름(Lable)메모리의 어떤 주소를 가리키고 있는지에 관한 정보이다.

선언한 포인터 타입(type)가리키고 있는 주소의 타입(type)이 반드시 일치해야 한다. 

(아래 주소값은 PC마다 다르게 표현되므로 임의로 표시)

위 예시의 메모리는 주소 0x0000 부터 0xFFFF 까지 있다고 가정.

int타입num 변수명으로 10 이 저장되어있음.

10이 저장되어있는 num의 주소값 (0xA2D1) 으로 variable(주소를 담을 수 있는)포인터 변수가 가리키고있음

포인터변수도 역시 고유의 자리 주소값이 있음. (0x12F3)

 

 

variable에 저장된 값은 num의 주소값이므로, 출력하면 num의 주소값이 나옴. (서로의 type이 int이기 때문에 저장가능)

variable을 출력하면 num의 주소값이 나올 것임, &num을 출력하면 당연히 num의 주소값이 출력.

#include <stdio.h>


int main()
{
    // num에 10을 저장.
    int num = 10;

    // variable 이라는 int형을 담는 포인터변수에 num의 주소값을 넣음. (variable -> num 가리킴)
    int* variable = &num;

    // &num : num의 주소값 출력
    // variable에는 num의 주소값이 들어가 있으므로 동일하게 출력됨
    printf("num의 주소값: %x\n variable의 주소값: %x\n", &num, variable);
    printf("variable의 주소값은: %x임", &variable);

    return 0;
}

(결과 확인)

반응형

포인터는 크게 상수형변수형로 나눌수 있다.

배열 선언시 char arr[ ]; 이런식으로 선언하는데 실제 arr 은 상수형 포인터다. 즉 주소값을 알고있는 Lable이다.

그래서 char * arr; 이랑 똑같은 구조라 할 수 있지만, * 로 선언하면 "변수"로 선언했기 때문에 포인터 변수의 주소값을 바꿀 수 있고,

arr [ ] 으로 선언하면 상수이므로 그 주소를 바꿀 수 없다. 그리고 이 arr은 내 첫번째 배열값의 주소를 가리키고 있다.

 

(상수형 포인터와 변수형 포인터 관계에 대해서는 아래 참고.)

https://ansan-survivor.tistory.com/1249

 

[C언어] C언어 배열과 포인터의 관계 (변수형 포인터, 상수형 포인터), 포인터로 배열 변경하기

포인터에 대한 간단한 설명은 아래 참고. https://ansan-survivor.tistory.com/1237 [C언어] 포인터란? 포인터에 대해 쉽게 이해하기. (포인터 변수 사용하기, 포인터로 값 변경하기, (알아두기) 컴퓨터는 32비

ansan-survivor.tistory.com

 

 

 

<포인터가 가리키는 값을 사용하기>

 

포인터가 가리키는 주소의 내부 값을 빼서 사용하기.

아래와 같이 *포인터변수명 특수문자를 이용해서 포인터가 가리키고 있는 곳에 가서 값을 사용할 수 있다.

#include <stdio.h>


int main()
{
    // num에 10을 저장.
    int num = 10;

    // variable 이라는 int형을 담는 포인터변수에 num의 주소값을 넣음. (variable -> num 가리킴)
    int* variable = &num;

    printf("num의 값: %d\n", num);
    // *포인터변수 를 이용하면 포인터 내부의 값을 사용
    printf("variable이 가리키는 주소에 들어있는 값: %d\n", *variable);


    return 0;
}

 

 

 

<포인터가 가리키는 값을 변경하기>

 

*포인터변수 = 값 을 이용해 반대로 값을 덮어씌울 수 있다.

새로운 변수에 복사해서 값을 대입한것이 아니다. 이는 "덮어씌운" 것이다. 즉, num에는 이제 30값이 저장된 것이다.

 

===============================

 

(알아두면 좋은 사항)

 포인터에서 많이 보는 연산자는 * 일것이다.

*를 어떤타입과 어느 위치에 쓰냐에 따라서 특색이 다 다르다.

 

1. 곱셈으로의 역할 (아래와 숫자 사이, 숫자를 가진 변수와 연산과 함께 쓰면 곱셈이다)

  int a = 1 * 2 ;
  int b = a * 3 ;

 

2. 포인터 선언에 대한 역할 (아래와 같이 포인터로 선언할때 사용한다.)

   포인터로 선언했기 때문에, 이제 ptr에는 int형 타입의 주소값을 저장할 수 있다.

  int * ptr;

 

3. 포인터가 가리키는 값에 대한 접근 (*ptr)

// 포인터 선언
int * ptr;
int num = 1;

// ptr에 num의 주소를 대입
ptr = &num

// *ptr을 이용해서 num주소에 있는 값을 출력할 수 있음
printf("ptr value is : %d", *ptr);

// *ptr을 이용해서 가리키고 있는 값을 바꿀 수 있음 (num값을 3으로 바꿈)
*ptr = 3;

 

 

(포인터 변수를 초기화 할때 주의해야 할 점!)

https://ansan-survivor.tistory.com/1248

 

[C언어] 포인터 변수의 초기화 선언 (잘못된 사용시 위험성)

포인터를 배우기전 대부분 C언어 타입과 변수 선언에 대해서 배우게 된다. 그리고 연산을 위해 초기값을 0으로 선언하기도 한다. (포인터 에 관해서 아래 참고) https://ansan-survivor.tistory.com/1237 [C언

ansan-survivor.tistory.com

 

반응형
반응형

C언어는 문자열을 표현하기 위해 배열(Array)를 활용한다.

 

그리고 문자열을 표현하기 위해 보통 1byte 크기인 'char' 타입을 사용한다.

문자열의 끝은 NULL을 사용한다. (문자열 마지막에 \0 이 있으면 문자열의 끝으로 인식)

고로 문자열의 크기는 마지막 1개가 더 필요하다. ("hello world!"의 경우에는 각 알파벳 + 띄어쓰기 + NULL 하여 총12개 필요)

각 배열에 들어가는 문자 하나하나는 모두 아스키코드이다. (아스키코드 번호임)

 

선언하고 만드는 방법은 아래와 같다.

<타입> <배열이름 [배열크기] >

// NULL과 띄어쓰기를 포함하여 총 13개의 char 크기가 필요
char str[13] = "Hello world!";

배열의 크기는 미리 정하지 않고 배열을 입력하면 알아서 사이즈가 잡히게 된다.

char str2[] = "hello world!";
반응형

아래 예시 코드를 돌려서 크기를 확인

#include <stdio.h>

/*
	배열은 보통 char형을 사용.
	알파벳 하나하나가 배열 한칸에 할당.
	문자열 구조는 맨 끝에 NULL문자( '\n' )가 들어가야 함
*/

int main()
{
	// NULL문자를 포함한 13개 배열이 할당되어야 함.
	char str1[13] = "nice to meet";
	// 배열크기 자동조절, hello NULL 문자 총 6개 배열이 할당됨. str2라는 주소에 값 할당.
	char str2[] = "hello world!";

	printf("배열 크기 : %d", sizeof(str1));
	printf("배열 크기 : %d", sizeof(str2));

	return 0;
}

 

(결과)

 

* 문자열을 scanf로 받는 방법.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	// 아래와 같은 배열명 선언은 배열 변수명 자체가 주소값으로 저장됨.
	char str[50];
	int index = 0;

	printf("문자열 쓰시오. :");
	// 문자열 변수명 str은 그자체가 주소값을 지칭하므로 &없이 사용. 즉, &str 으로 사용하지 않음.
	scanf("%[^\n]", str);
	printf("입력받은 문자열 : %s\n", str);

	printf("문자 단위 출력: ");
	while (str[index] != '\0')
	{
		printf("%c", str[index]);
		index++;
	}
	printf("\n");

	return 0;
}

(결과)

아래에서 scanf에 %[^\n]  을 입력한 이유는, 띄어쓰기 키가 와도 문자열을 계속 이어서 str에 저장하기 위함.

 

 

 

 

 

 

 

반응형
123

+ Recent posts