[C언어 복습] 포인터(배열포인터, 포인터배열)

2021. 2. 5. 04:36·Major/C&C++
728x90

배울 때 엄청 헷갈렸던 포인터...(사실 지금도 헷갈림)

 

1. 포인터

1) 의미 : 변수의 주소를 저장하는 변수

#include <stdio.h>

int main()
{
    int *numPtr;      // 포인터 변수 선언
    int num1 = 10;    // int형 변수를 선언하고 10 저장

    numPtr = &num1;   // num1의 메모리 주소를 포인터 변수에 저장

    printf("%p\n", numPtr);    // 0055FC24: 포인터 변수 numPtr의 값 출력
                               // 컴퓨터마다, 실행할 때마다 달라짐
    printf("%p\n", &num1);     // 0055FC24: 변수 num1의 메모리 주소 출력
                               // 컴퓨터마다, 실행할 때마다 달라짐

    return 0;
}

//출처 : (c언어코딩도장)dojang.io/mod/page/view.php?id=275)

- 포인터 선언 방식

int *ptr;
ptr = &a; 

 

int *ptr = &a; 

❗ 주의사항 

int a = 10;
int *ptr = &a; //ptr이라는 포인터는 a의 주소를 저장함
*ptr = 20;  //ptr이 가르키는 a의 값을 20으로 바꾼다.

정리해보면 

& : 변수의 주소

* : 포인터가 가리키는 주소에 저장된 값

 

2. 배열과 포인터

1) 배열의 크기

- int 배열을 선언했다면, 배열에 담긴 요소하나하나는 4byte를 가지게 된다.

int arr[5] = {1,2,3,4,5};
int *p = arr; //&arr 아님
for(int i=0;i<5;i++){
	printf("%d ",p+i);
    }
}   

답 출력 : 5240664 5240668 5240672 5240676 5240680(주소는 컴파일할때마다 달라진다.)

❗ 주소가 4씩 차이가 나는 것을 알 수 있다.  

 

2) 헷갈리는 것(int *ptr = arr일 때) 

① ptr = &arr[0](배열의 주소)

② *ptr = arr[0](배열의 값)

③ ptr +1 = ptr에 sizeof(*ptr)을 더한 값

// 참고사항 : arr[i] = *(arr+i) = *(ptr +i) = *(i+ptr) = i[ptr]

왜냐하면 컴퓨터는 a[b]를 *(a+b)로 받아들이기 때문 

④ 2차원 배열에서 string[i] = &string[i][0]  이다.

 

* 이차원 배열에서의 포인터

int arr[3][3] = {0} 이라고 할 때,

&arr = arr[3][3] 전체배열의 주소값을 이야기 함 = arr[0][0]의 주소값

arr = &arr[0] 이므로 0행의 배열의 주소를 이야기함 = arr[0][0]의 주소값

*arr = *&arr[0] = arr의 0행이 가르키는 값을 이야기함 = arr[0][0]의 주소값

행을 출력하는 건 그 행의 첫번 째 요소의 주소값을 출력하는 것과 같다.

 

 

3. 배열포인터 (2와 다름)

1) 의미 : 특정 사이즈의 배열을 가르키는 포인터

2) 선언 방법 : 

int arr[3] = {1,2,3};
int (*ptr)[3]; //길이가 3인 int형 배열을 가르키는 포인터를 선언
ptr = &arr;

- 궁금할 사항 :

ptr[1]을 출력 시 arr[1]의 주소값 출력,

(*ptr)[1]을 출력 시 arr[1]의 값(2) 출력

*ptr[1]을 출력 시 잘못된 데이터를 읽고 있다고 경고가 뜹니다.

 

4. 포인터 배열

1) 의미 : 배열의 요소가 포인터로 이루어져 있음

2) 선언 방법 : 배열 포인터에서 가로만 빼주면 된다.

int *ptr[4];
//사용방법
int a =10;
ptr[0] = &a 

 

 

 

하면서도 헷갈려요... 언제쯤 완벽하게 이해할련지...

 

728x90
저작자표시 비영리 (새창열림)

'Major > C&C++' 카테고리의 다른 글

[C언어] 포인터로 두 변수의 값 서로 바꾸기  (0) 2021.04.08
[C언어] 구조체  (0) 2021.04.08
[C언어] 문자/문자열 입력받기(여러개 입력받기)  (8) 2021.04.04
[C언어 복습] 문자열  (0) 2021.02.01
[C언어 복습] 배열  (0) 2021.02.01
'Major/C&C++' 카테고리의 다른 글
  • [C언어] 구조체
  • [C언어] 문자/문자열 입력받기(여러개 입력받기)
  • [C언어 복습] 문자열
  • [C언어 복습] 배열
BeNI
BeNI
코딩하는 블로그
  • BeNI
    코딩못하는컴공
    BeNI
  • 전체
    오늘
    어제
    • Menu (253)
      • My profile (1)
      • 회고 | 후기 (8)
      • Frontend (65)
        • Article (11)
        • Study (35)
        • 프로그래머스 FE 데브코스 (19)
      • Backend (0)
      • Algorithm (58)
        • Solution (46)
        • Study (12)
      • Major (111)
        • C&C++ (23)
        • Java (20)
        • Data Structure (14)
        • Computer Network (12)
        • Database (15)
        • Linux (6)
        • Architecture (3)
        • Lisp (15)
        • OS (1)
        • Security (2)
      • etc (2)
  • 링크

    • 깃허브
    • 방명록
  • 인기 글

  • 최근 댓글

  • 최근 글

  • 태그

    C++
    react
    데브코스
    프로그래머스
    자료구조
    lisp
    백준
    파일처리
    리팩토링
    Algorithm
  • hELLO· Designed By정상우.v4.10.2
BeNI
[C언어 복습] 포인터(배열포인터, 포인터배열)
상단으로

티스토리툴바