(알아두기)
컴퓨터는 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의 주소값 출력
// 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
<포인터가 가리키는 값을 사용하기>
포인터가 가리키는 주소의 내부 값을 빼서 사용하기.
아래와 같이 *포인터변수명 특수문자를 이용해서 포인터가 가리키고 있는 곳에 가서 값을 사용할 수 있다.
#include <stdio.h>
int main()
{
// num에 10을 저장.
int num = 10;
// variable 이라는 int형을 담는 포인터변수에 num의 주소값을 넣음. (variable -> num 가리킴)
int* variable = #
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++ > 포인터 \ 배열' 카테고리의 다른 글
[C언어] 포인터로 문자열 선언, 배열 문자열 선언과 차이. (문자열 내부 변경하기) (0) | 2022.02.05 |
---|---|
[C언어] C언어 배열을 포인터로 변환하기 (배열을 포인터로 바꾸기) (0) | 2022.02.05 |
[C언어] C언어 배열과 포인터의 관계 (변수형 포인터, 상수형 포인터), 포인터로 배열 변경하기 (0) | 2022.02.05 |
[C언어] 포인터 변수의 초기화 선언 (잘못된 사용시 위험성) (0) | 2022.02.05 |
[C언어] C언어 문자열 배열 만들기, 구조에 대해서, scanf 문자열 출력 (0) | 2022.02.01 |