몽상실현개발주의

[따배씨] 10.15 포인터의 호환성 본문

Language/C

[따배씨] 10.15 포인터의 호환성

migrationArc 2021. 6. 7. 09:28

 

[따배씨] 10.15 포인터의 호환성

따배씨 - 따라하며 배우는 C언어

10강 배열과 포인터

10.15 포인터의 호환성 Compotaibility

  • 문법적으로 가능하지만, 사용상 권장하지 않는 내용이 많이 포함됨

 

#include <stdio.h>

int main(){
    int n = 5;
    double x;
    x = n;
    int* p1 = &n;
    double* pd = &x;
    pd = (double *)p1;
    
    return 0;
}
  • pointer의 형변환, 권장 X

 

#include <stdio.h>

int main(){
    int* pt;
    int (*pa)[3];   // 3개짜리 원소를 가진 배열의 포인터
    int arr1[2][3] = {3, };
    int arr2[3][2] = {7,};
    int** pt2;  // 이중 포인터
    
    pt = &arr1[0][0];
    
    return 0;
}
pt = &arr1[0][0];
pt = arr1[0];
  • 같은 표현
  • 일차원 배열의 pointer 를 이용하여 다차원 배열의 원소를 모두 접근 가능
pt = arr;
// Error
  • 이차원 배열은 포인터에 담을 수 없음

 

 

#include <stdio.h>

int main(){
    int* pt;
    int (*pa)[3];   // 3개짜리 원소를 가진 배열의 포인터
    int arr1[2][3] = {3, };
    int arr2[3][2] = {7,};
    int** pt2;  // 이중 포인터
    
    pa = arr1;
    pa = arr2;
    
    return 0;
}
pa = arr2;
// Warning
int *(pa)[3];
int arr2[3][2];
  • 원소의 숫자가 맞지 않음
  • 권장하지 않는 사용 방법

 

 

#include <stdio.h>

int main(){
    int* pt;
    int (*pa)[3];   // 3개짜리 원소를 가진 배열의 포인터
    int arr1[2][3] = {3, };
    int arr2[3][2] = {7,};
    int** pt2;  // 이중 포인터
    
    pt2 = &pt;
    *pt2 = arr2[0];
    pt2 = arr2;
    
    return 0;
}
pt2 = arr2;
// Warning
  • 형식이 맞지 않음
    • pt2 : 인트에 대한 포인터에 대한 포인터
    • arr2 : 두개의 인트를 가진 배열에 대한 포인터

 

 

#include <stdio.h>

int main(){
    int x = 20;
    const int y = 23;
    
    int* p1 = &x;
    
    const int* p2 = &y;
    const int** pp2 = &p1;	// Warning
    
    //*p2 = 123;    // Error    // *p2 == y, y 는 const
    
    //p1 = p2;      // Warning (Error)    // const int 를 int 에 할당하기 때문에 Warning
    p2 = p1;
    
    int x2 = 30;
    int* p3 = &x2;
    *pp2 = p3;
    pp2 = &p1;	// Warning
    
    return 0;
}
*p2 = 123;    // Error
  • *p2 는 y 와 같고, y 는 const 로 선언 되었기 때문에 값을 변경 할 수 없음
//p1 = p2;      // Warning (Error)
  • const int 를 int 에 할당하기 때문에 Warning
const int** pp2 = &p1;	// Warning
  • Initializing 'const int ' with an expression of type 'int ' discards qualifiers in nested pointer types
  • compiler 에서 허용
pp2 = &p1;	// Warning
  • Assigning to 'const int ' from 'int ' discards qualifiers in nested pointer types
  • compiler 에서 허용

 

 

#include <stdio.h>

int main(){
    const int** pp2;
    int* p1;
    const int n = 13;
    
    pp2 = &p1;  // const?
    *pp2 = &n;  // steps p1 to point at n
    *p1 = 10;    // change n
    
    return 0;
}
  • const 로 선언한 변수를 pointer 로 회피해서 변경하는 방법은 사용하지 말자
    • c++ 에서는 엄격하게 금지, Error

 

 


이 글의 모든 사진과 내용의 출처는 홍정모 교수님께 있음을 알려드립니다.

http://blog.naver.com/atelierjpro

 

실리콘 밸리의 프로그래머 : 네이버 블로그

안녕하세요! 홍정모 블로그에 오신 것을 환영합니다. 주로 프로그래밍 관련 메모 용도로 사용합니다. 강의 수강하시는 분들은 홍정모 연구소 카페로 오세요.

blog.naver.com

http://www.inflearn.com/course/following-c

 

홍정모의 따라하며 배우는 C언어 - 인프런 | 강의

'따배씨++'의 성원에 힘입어 새롭게 개발된 C 언어로 시작하는 프로그래밍 입문 강의입니다. '따배씨'와 함께 프로그래밍 인생을 업그레이드 해보세요., 따라하며 배우는 C언어 '따배씨++'의 성원

www.inflearn.com

 

Comments