ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1067)
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (180)
      • Unreal (69)
      • Unity (100)
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (346)
      • C++ (167)
      • C# (88)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • SQL
  • 문자열
  • Unity
  • 함수
  • 오블완
  • 프로그래머스
  • 티스토리챌린지
  • c#
  • string
  • C++
  • 언리얼
  • 그래픽스
  • 파이썬
  • 배열
  • 유니티
  • 포인터
  • 백준
  • 클래스
  • C
  • 알고리즘

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

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

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

2023. 9. 17. 17:43

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

결론부터 말하자면, 배열을 선언하는 변수는 "상수형 포인터" 그 외는 "변수형 포인터"이다.

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

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

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

(이때 arr의 자료형이 무엇이냐? 하면 포인터이므로 char * 자료형이다 라고 한다.)

 

<아래 그림의 예시 설명>

 - int arr[ ]; 으로 선언하면 int형크기(4 byte) 간격으로 나란히 배열되어있는 메모리의 주소를 선언하는 것이다.

 - 아래 그림의 화살표는 메모리상의 주소를 가리키는 것을 표현
 - arr 은 주소값을 저장할 수 있는 포인터이다. 그러나 가리키는 방향(화살표)를 바꿀 수 없는 "상수" 이다.

 - ptr 은 &num 같이 어떤걸 입력하냐에 따라 가리키는 방향(화살표)를 바꿀 수 있는 "변수"이다.

 - arr도 포인터기 때문에 *arr = 10과 같이 연산이 가능하다. (arr 첫번째 배열값 변경을 의미)

 

 

  <배열의 주소값 int 타입 확인>

     - 아래 결과를 보면, arr 의 주소는 첫번째 배열의 주소값인 &arr[0] 임을 알 수 있다.

     - 그리고 뒤 이어 배열의 값들은 int형이 4byte 임으로 순차로 4씩 증가함을 알 수 있다.

#include <stdio.h>

int main()
{
    int arr[3] = {0, 1, 2};


    // 배열의 각 주소값 확인
    // 자료형은 int이므로 4byte씩 증가
    printf("배열 주소: %p\n", arr);
    printf("첫번째 : %p\n", &arr[0]);
    printf("두번째 : %p\n", &arr[1]);
    printf("세번째 : %p\n", &arr[2]);

    return 0;
}

 

<포인터를 이용해서 배열 내부값 조작 - 방법 1>

배열이 포인터 형태임을 알았으니, 포인터를 이용해서 배열 내부의 값들을 조작할 수 있다.

int * ptr = &arr[0] ;  은 arr의 첫번째 주소를 ptr으로 가리키는 것이다. (arr 자체가 주소값이므로 int * ptr = arr 으로도 사용 가능)

*ptr 는 배열의 첫번째 항의 값을 출력함으로 0을 리턴.

*(ptr + 1) 은 ptr의 주소값에서 +1 (int형이므로 4byte) 뒤로 더한곳으로 주소를 가리킨다.

 

#include <stdio.h>

int main()
{
    int arr[3] = { 0, 1, 2 };
    // 배열 초기값 출력 해보기
    printf("arr[0] : %d\n", arr[0]);
    printf("arr[1] : %d\n", arr[1]);
    printf("arr[2] : %d\n", arr[2]);


    // 배열을 조작할 포인터 선언, arr[0] 첫번째 주소를 가리킴.
    int* ptr = &arr[0];

    // 첫번째 값 바꾸기
    *ptr = 10;
    // 두번째 값 바꾸기, 자료형이 int이므로 1씩 증가하면 4byte씩 뒤로 이동.
    *(ptr + 1) = 30;
    // 세번쨰 값 바꾸기
    *(ptr + 2) = 300;

    // 배열 출력해보기
    printf("변경 후 배열 출력\n");
    printf("arr[0] : %d\n", arr[0]);
    printf("arr[1] : %d\n", arr[1]);
    printf("arr[2] : %d\n", arr[2]);

    return 0;
}

 

  <포인터를 이용해서 배열 내부값 조작 - 방법 2>

선언한 포인터가 배열의 첫번째 칸을 가리키면, 포인터도 마치 배열처럼 쓸 수 있다.

 

#include <stdio.h>

int main()
{
    int arr[3] = { 0, 1, 2 };
    // 배열 초기값 출력 해보기
    printf("arr[0] : %d\n", arr[0]);
    printf("arr[1] : %d\n", arr[1]);
    printf("arr[2] : %d\n", arr[2]);


    // 배열을 조작할 포인터 선언, arr[0] 첫번째 주소를 가리킴.
    int* ptr = &arr[0];

    // 첫번째 값 바꾸기
    ptr[0] = 50;
    // 두번째 값 바꾸기, 자료형이 int이므로 1씩 증가하면 4byte씩 뒤로 이동.
    ptr[1] = 70;
    // 세번쨰 값 바꾸기
    ptr[2] = 100;

    // 배열 출력해보기
    printf("변경 후 배열 출력\n");
    printf("arr[0] : %d\n", arr[0]);
    printf("arr[1] : %d\n", arr[1]);
    printf("arr[2] : %d\n", arr[2]);

    return 0;
}

 

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

저작자표시 (새창열림)

'프로그래밍 언어 > C++' 카테고리의 다른 글

[실4] 28279 - 덱2  (0) 2023.09.19
[C++] emplace_back 과 push_back 의 차이  (0) 2023.09.19
[C] 포인터로 문자열 선언, 배열 문자열 선언과 차이. (문자열 내부 변경하기)  (0) 2023.09.17
[C] 문자열(string) 입출력 (puts, fputs, gets, fgets) 사용법  (0) 2023.09.17
[C] open, close, read 함수에 대하여  (0) 2023.09.17
    '프로그래밍 언어/C++' 카테고리의 다른 글
    • [실4] 28279 - 덱2
    • [C++] emplace_back 과 push_back 의 차이
    • [C] 포인터로 문자열 선언, 배열 문자열 선언과 차이. (문자열 내부 변경하기)
    • [C] 문자열(string) 입출력 (puts, fputs, gets, fgets) 사용법
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바