Layer7

C Pointer

whtRy0u 2021. 5. 11. 16:23

1. 포인터를 알기 전 미리 알아야 하는 것

  • 변수 : 데이터를 저장하는 공간
  • 주소값 : 데이터가 저장된 메모리의 시작하는 주소

 

2. Pointer란?

주소값을 저장하는 변수

 

3. 포인터에서 쓰는 연산자

  • 주소 연산자 & : 변수가 저장된 메모리의 주소를 나타냄
int num1 = 10;
printf("num1 값 : %d\n",num1);
printf("num1의 주소 : %d\n",&num1);

● 출력 결과

 

  • 역참조 연산자 * : Pointer 변수가 가르키는 메모리 주소의 담긴 값을 가져올 때 사용
  • * : Pointer 변수를 선언할 때 사용
int num1 =10;
int* ptr1 = &num1; // 포인터 변수 선언

printf("num1 값 : %d\n", num1);
printf("num의 주소 : 0x%x\n", num1);
printf("num1의 값 : %d\n", * ptr1);

 

● 출력 결과

 

4. 포인터 변수 선언

자료형* 변수명;

자료형 * 변수명;

자료형 *변수명;

→3가지 방법 중 어떤 것을 사용해도 상관X

int number =11;
int* pointer = &number; //*를 사용하여 pointer 변수를 선언

printf("number value : %d\n", number);
printf("number address : 0x%x\n", &number);
printf("pointer : 0x%x\n", pointer);
printf("* pointer : %d\n", * pointer);

● 출력 결과

 


5. 포인터의 사칙연산

  • 포인터의 덧셈

→ 포인터끼리의 연산은 의미가 없다

 

→ 포인터에 정수값을 더하는 것만 의미있다

int num = 0x10; // 변수 선언 및 초기화
int* pNum = # // 포인터 변수 선언 및 초기화
	
char ch = 'A';
char *pCh = &ch;
	
printf("pNum : %d\n", pNum); // 각각의 주소값
printf("pCh : %d\n", pCh);
	
printf("== operate +1 ==\n");
printf("pNum : %d\n", pNum + 1); // 각각의 주소값 +1
printf("pCh : %d\n", pCh + 1);

● 출력 결과

 

→ 포인터가 가리키는 변수의 자료형 크기만큼 증가 (int 4byte / char 1byte)

 

할당할 때 (포인터 변수의 크기) 참조할 때 (포인터 변수가 가리키는 변수)
운영체제에 따라서 메모리 크기가 달라짐 자료형의 크기만큼 참조
32bit 운영체제 4byte
64bit 운영체제 8byte
char 1byte
int 4byte
double 8byte
int* pNum = &num *pNum // &num
int num = 0x10;
int *pNum = #

char ch = 'A';
char *pCh = &ch;

printf("pNum : %d\n", sizeof(pNum));
printf("pCh : %d\n", sizeof(pCh));

● 출력 결과 (64bit 운영체제)

→ 1 word == 8byte

 

  • 포인터의 뺄셈
int num1 = 0x10;
int num2 = 0x20;
	
int* pNum1 = &num1;
int* pNum2 = &num2;

printf("%d - %d = %d\n", pNum1, pNum2, pNum1 - pNum2);

● 출력 결과

 

→ 뺄셈은 두 포인터 사이의 거리를 나타냄

 

  • 포인터의 곱셈

  • 포인터의 나눗셈

→ 곱셈과 나눗셈 모두 의미가 없다

 


6. 인수 전달

  • Call by value (값의 의한 호출)

: 함수에서 값을 복사해서 전달하는 방식. 원래 변수에는 영향을 미치지 않음

 

● 출력 결과

 

  • call by reference (참조에 의한 호출)

: call by value와 다르게 변수를 복사만 하는 것이 아니라 주소에 접근하여 변수 값 변경 가능

 

● 출력 결과

 


<< 다중 포인터 >>

다중 for문이라고 하면 for문 안에 또 다른 for문이 있는 것처럼 포인터가 여러 번 쓰인 것이 다중 포인터가 아닐까