[c] 포인터

letsbebrave·2022년 4월 30일
0

C

목록 보기
1/7

참고한 자료
https://eskeptor.tistory.com/119?category=928922

포인터

  • struct
    구조체라는 것
    변수를 담을 수 있고 메소드는 담을 수 없음
    구조체가 발전된 게 자바에서 class에 메소드와 변수를 담을 수 있는 것
  • 변수
    값을 저장할 수 있는 메모리 공간에 붙여진 이름
  • 선언
    변수라는 것을 선언하면 메모리 공간이 할당됨
    할당된 메모리 공간에 이름이 붙음
  • 초기화
    변수에 처음 값을 넣어주는 게 초기화

기본 예시

#include <stdio.h> 
int main() 
{ 
int num = 5; 
int* ptrNum = &num; // num의 주소값을 int형 포인터형 변수인 ptrNum에 넣어줌
// 선언할 때 *의 의미는 "포인터형 변수"를 선언한다는 뜻
// 즉, ptrNum에 num의 주소값이 들어가 있단 걸 아는 게 가장 중요!!

// 5 출력됨
printf("num: %d \n", num); // num의 값 

// 5 출력됨
printf("*ptrNum: %d \n", *ptrNum); // 포인터를 이용하여 나온 값 
// 포인터형 변수인 ptrNum
// 즉 num의 주소값이 들어가 있는 ptrNum 변수가 담고 있는 메모리 주소에 저장되어 있는 내용을 역참조로 가져옴

// 0x7ffe6b6dcc44 출력됨
printf("num's address: %p \n", &num); // num의 주소값 

// 0x7ffe6b6dcc44 출력됨
printf("ptrNum's address: %p \n", ptrNum); // 포인터가 담은 변수의 주소값 
return 0; 
}

배열과 포인터

#include <stdio.h> 
int main() 
{ 
int arr[4] = {1, 2, 3, 4}; 

int* ptr = arr; 
// 포인터를 배열의 첫번째 인덱스에 연결(arr[0])
// 배열의 이름은 배열의 첫번째 요소의 "주소"를 담고 있으므로 &를 안 써줘도 됨! (바로 주소)
// 변수에 포인터를 연결했을 때와 동일하게 자료형이 같아야.

return 0; 
}

출처: https://eskeptor.tistory.com/120?category=928922 [Hello World]

포인터 연산

printf("*(ptr + 1): %d \n", *(ptr + 1)); 
printf("*(++ptr): %d \n", *(++ptr));
// 포인터의 주소에 1을 더한다.
// 해당 포인터의 자료형에 맞게 다음 주소로 이동한다는 것.
// int형 포인터가 가리키는 이전주소가 0004였다면 1을 더하면 0008이 됨

printf("*ptr + 1: %d \n", *ptr + 1); 
// 포인터가 가리키는 값의 결과에 1을 더한다.
#include <stdio.h> 
int main() 
{ 
  int nums[4] = {1, 2, 3, 4}; 
  int* ptr = nums; // 포인터를 배열의 첫번째 인덱스에 연결(nums[0])    printf("*ptr: %d \n", *ptr); // arr[0] 
  printf("*(ptr + 1): %d \n", *(ptr + 1)); // arr[1]: arr 주소(배열은 이름이 주소를 담음)의 첫번째 값을 가져오는 것
  printf("*(ptr + 2): %d \n", *(ptr + 2)); // arr[2] 
  printf("*(ptr + 3): %d \n", *(ptr + 3)); // arr[3] 
  return 0; 
}

배열을 매개변수로 할 때

#include <stdio.h>
#include <string.h>
int sumArr(int* arr, int length) 
// sumArr함수에서 arr을 매개변수로 받을 때 배열의 이름이 주소값이기 때문에 
// 처음 받을 때 자료형을 알려주기 위해 int*, 즉 int형 포인터형 변수라는 것을 말해줌
{ 
  int total = 0; 
  for (int i = 0; i < length; i++) 
  { 
  	total += arr[i]; // *(arr + i)와 동일함! arr의 주소에 접근해 i번째 값을 가져온다는 것
  } 
  return total; 
} 

void printArr(int* arr, int length) 
{ 
  printf("배열: "); 
  for (int i = 0; i < length; i++) 
  { 
  	printf("%d ", arr[i]); // *(arr + i)와 동일함! arr주소에 접근해 i번째 값을 가져옴
  } 
  printf("\n"); 
}

int main(void) 
{ 
  int arr[] = { 1, 2, 3, 4 }; 
  printArr(arr, sizeof(arr) / sizeof(int)); 
  printf("배열의 총합: %d\n", sumArr(arr, sizeof(arr) /sizeof(int))); 
  return 0; 
}
profile
그게, 할 수 있다고 믿어야 해

0개의 댓글