< C언어 복습 >

const 위치 의미

const는 바로 뒤에있는 키를 상수로 고정한다.

  1. (*) 앞에 const 붙으면 가리키는 곳이 불변
int value = 42;
const int* p = &value;
p = &value; // OK
*p = 10; // error
  1. (*) 후에 const 붙으면 포인터변수 자체가 불변
int value = 42;
int* const p2 = &value;
p2 = &value; // error
*p2 = 10; // OK
  1. (*) 양쪽에 const 붙으면 포인터변수도, 가리키는 값도 모두 불변
int value = 42;
const int* const p = &value;
p = &value; // error
*p = 10;    // error

복잡한 선언문 해석

short*(*(*var)())[5];

1. var; // The identifier 'var' is declared as
2. *var; // a pointer to
3. *var(); // a function returning (함수가 리턴한게 포인터(주소값 가져옴))
4. *(*var)(); // a pointer to 
5. *(*var)()[5]; // an array of 5 elements, which are
6. *(*(*var)())[5]; // pointers to
7. short*(*(*var)())[5]; // short values

형변환과 정수의 승격

형변환에는 두가지가 있음

  • 자동형변환 : 자동으로 발생하는 형변환
  • 강제형변환 : 프로그래머가 강제로 형변환
  1. 자동형변환 - 대입연산
double a = 10; // double형에 정수 10, a=10.0으로 자동형변환
int b = 10.5; // int형에 실수 10.5, b=10으로 자동형변환, 데이터 손실 주의
int c = 385;
char d = c; // c 표현하면 1 1000 0001 인데 char형이 1바이트밖에 못봐서 1000 0001 
//= -129, 상위 바이트 손실
  1. 자동형변환 - 정수의 승격
    cpu가 처리하는데 가장 적합한 크기의 자료형은 int (32비트)
    int형 연산속도가 다른 자료형의 연산속도에 비해 동일하거나 더빠름
short a = 10, b = 15;
short result = a + b; // a, b는 int로 형변환(승격) result도 int로 형변환
  1. 자동형변환 - 자료 불일치
double a = 12.5 + 10; // 12.5 + 10.0, 데이터 손실 최소화 방향으로 진행
  1. 강제형변환 - 프로그래머가 행변환 연산자 이용
int a = 5, b = 4;
double result = 0;
result = a/b; // 1 나옴, int 연산후 double 대입한 결과
result = (double) a/b; // 1.25000 나옴, (double)a로 실수 형변환 후 연산 결과

배열, 포인터배열, 배열포인터

#include <stdio.h>

int main()
{
    // 주소 연산 방식
    int arr[3] = {1,2,3};
    printf("arr[0] : %d\n", arr[0]); // arr[0] 값 1
    printf("arr : %d\n", arr); // 배열 이름 = arr[0] 주소 
    printf("arr+1 : %d\n", arr+1); // arr[0] 주소+4 (arr[1])
    printf("*(arr+1) : %d\n", *(arr+1)); // arr[1] 값 2

    // 포인터 배열
    char* data[] = {"가나다", "ABC", "포인터"}; 
    // 포인터를 요소로 갖는 포인터배열 data
    int i;
    for(i=0; i<3; i++)
    {
        printf("data+%d : %d\n", i, data+i);
        printf("data[%d] : %s\n", i, data[i]);
    }

    // 배열 포인터
    char arr2[3][7] = {{1,2,3,4,5,6,7}, {11,12,13,14,15,16,17}, {21,22,23,24,25,26,27}}; 
    // char 7칸짜리 1차원 배열을 3개 가지는 2차원 배열 arr2
    char (*data2)[7]; // char[7] 배열들의 주소값을 가리키는 배열 포인터 data2
    data2 = arr2; // data2는 arr2를 가리킨다
    int j;
    for (j=0; j<3; j++) {
    printf("*(data2+%d): %d\n", j, *(data2+j)); // char[7]배열들 주소
    printf("*(*(data2+j)): %d\n", *(*(data2+j))); // char[7]배열들 주소에 들은 값
    }    

    return 0;
}

어셈블리 명령어 예제
https://m.blog.naver.com/PostView.nhn?blogId=skddms&logNo=110175661697&proxyReferer=https:%2F%2Fwww.google.com%2F

profile
Backend Web Developer

1개의 댓글

comment-user-thumbnail
2023년 8월 25일

참고되었습니다. 감사합니다. ^^

답글 달기
Powered by GraphCDN, the GraphQL CDN