C 언어

    포인터 완전 정복을 위한 포인터 이해하기 (2)

    포인터 완전 정복을 위한 포인터 이해하기 (2)

    포인터의 대입 규칙 규칙 1. 포인터는 가리키는 변수의 형태가 같을 때만 대입해야 한다 #include int main(void) { int a = 10; int* p = &a; double* pd; pd = p; printf("%lf\n", *pd); return 0; } ==> 위에 그림처럼 *pd가 사용하는 영역이 변수 a의 영역보다 크기 때문에 알 수 없는 값이 나오는 것이다 (포인터 pd의 반환형이 int형 이라면 컴파일했을 때 10이 나왔을 것이다) 규칙 2. 형 변환을 사용한 포인터의 대입은 언제나 가능하다 double a = 3.4; double *pd = &a; int *pi; pi = (int*)pd; // double형 포인터 pd를 int형으로 바꿔줬다 ==> 위의 그림처럼 *pi가..

    포인터 완전 정복을 위한 포인터 이해하기 (1)

    포인터 완전 정복을 위한 포인터 이해하기 (1)

    포인터는 주소를 저장하는 일정한 크기의 메모리 공간이다 주소와 포인터의 차이 주소 변수에 할당된 메모리 저장 공간의 시작 주소 값 자체 '상수' 포인터 그 값을 저장하는 또 다른 메모리 공간 '변수' *즉 두 포인터가 같은 주소를 저장하는 일도 가능해짐 주소와 포인터의 크기 포인터의 크기는 저장할 주소의 크기에 따라 결정됨 포인터의 크기는 컴파일러에 따라 다를 수 있다 모든 주소와 포인터는 가리키는 자료형에 관계없이 크기가 같다 #include int main(void) { char ch; int in; double db; char* pc = &ch; int* pi = ∈ double* pd = &db; printf("char형 변수의 주소 크기 : %d\n", sizeof(&ch)); printf..

    포인터의 기본 개념 (2)

    포인터의 기본 개념 (2)

    간접 참조 연산자 * , const를 사용한 포인터 포인터와 간접 참조 연산자 : * 포인터 주소를 저장하는 변수로 일반 변수와 마찬가지로 선언 후에 사용한다 (선언할 때 변수 앞에 *만 붙여준다) #include int main(void) { int a; // 일반 변수 선언 int *pa; // 포인터 변수 선언 pa = &a; // 포인터에 a의 주소값 대입 *pa = 10; // 포인터로 변수 a에 10 대입 printf("포인터로 a 값 출력 : %d\n", *pa); printf("변수명으로 a 값 출력 : %d\n", a); return 0; } *pa == a ==> 값이 같은 걸로 보았을 때 위에 코드처럼 포인터 pa와 변수 a는 같다는 것을 알 수 있다 int *pa; ==> 포인터의 ..

    포인터의 기본 개념 (1)

    포인터의 기본 개념 (1)

    포인터를 시작하기에 앞서.. 지금까지 변수 선언으로 메모리 공간을 확보하고, 그곳을 데이터를 넣고 꺼내 쓰는 공간으로 사용했다. 변수명은 그러한 메모리 공간을 식별할 수 있는 이름이었다 그러나 변수는 선언된 블록 {} 또는 함수 내부로 사용이 제한되어 있다. 그래서 사용 범위를 벗어난 경우도 데이터를 공유할 수 있는 방법인 포인터를 알아야 한다! 메모리의 주소, 주소 연산자 & 메모리의 주소 메모리라는 것은 우리가 데이터를 넣고 꺼내 쓰는 공간으로, 그 위치를 식별할 수 있어야 한다 프로그램이 사용하는 메모리의 위치를 주소 값으로 식별할 수 있다 메모리의 위치를 식별하는 주소 값은 바이트 단위로 구분된다 0부터 시작하고 바이트 단위로 1씩 증가하므로 2바이트 이상의 크기를 갖는 변수는 여러 개의 주소 값..

    문자를 저장하는 배열

    문자를 저장하는 배열

    char형 배열의 선언과 초기화 char형 배열을 선언할 때 저장할 문자열의 길이보다 최소한 하나 이상 크게 배열을 선언 여분의 공간이 필요한 이유 ==>널 문자 (\0)를 저장하기 위해서 1) 문자 상수로 하나씩 초기화 char str[80] = {'a', 'p', 'p', 'l', 'e', 'j', 'a', 'm'}; ==> 이렇게 해도 가능하지만 쉽지 않다 2) 문자열 상수로 한 번에 초기화 char str[80]= "applejam"; ==> 문자열 초기화는 대부분 이렇게 한다 널 문자의 용도 널 문자란 char형 배열에 저장된 0을 의미 문자열의 끝을 표시 *char형 배열 선언 시 초기화하지 않은 경우 char str[80]; // 배열 선언, 초기화 아직 안됨 str[0] = 'a'; // ..

    배열의 선언과 사용

    배열의 선언과 사용

    배열의 선언 배열 또한 다른 자료형처럼 선언을 통해서 저장 공간을 확보하고 한 번에 변수를 여러 개 선언한다 int형 변수 5개를 하나씩 선언하는 것의 크기 = 전체 저장 공간의 크기 ==> 변수는 각각의 공간에 이름을 지칭한다 ==> 배열은 메모리에 연속된 공간이 할당되며, 하나의 이름을 사용한다 ==> 배열은 각 저장 공간을 이름과 첨자로 구분하고 첨자는 0부터 시작한다 배열의 사용 ==> 배열을 선언할 때 대괄호 ([])는 전체 개수를 의미 ==> 배열 요소를 사용할 때 대괄호 ([])는 각 요소가 배열에서 몇 번째에 있는지를 의미 *배열의 첨자가 사용 범위를 벗어난다면 컴파일러가 경고 메세지를 알려주기도 하지만 에러 메세지를 표시하지 않을수도 있어서 버그를 잡기가 쉽지 않아진다 처음부터 사용할 때..

    여러 가지 함수 유형

    여러 가지 함수 유형

    매개변수가 없는함수 예를 들어 키보드로 수를 입력해서 양수를 반환하는 함수를 만든다면 호출한 함수로부터 값을 받을 필요가 없으므로 매개변수도 필요 없게 된다 #include int get_num(void); int main(void) { int result; result = get_num(); printf("반환값: %d", result); return 0; } int get_num(void) // 매개변수는 없고 반환형만 있다 { int num; printf("양수 입력: "); scanf("%d", &num); return num; // 반환형 } 반환값이 없는 함수 데이터를 받아서 단지 화면에 출력하는 함수라면 특별히 반환값이 필요 없다 #include void print_char(char ch, ..

    함수의 작성과 사용

    함수의 작성과 사용

    함수 기능을 수행하는 코드 단위 표준 라이브러리 함수 특정 기능을 미리 약속하고 프로그램에서 바로 사욯할 수 있게 구현되어 있는 함수 ex) printf, scanf = (stdio.h 헤더 파일에 포함되어 있다) 함수의 3가지 상태 함수 정의 실제 코드로 함수를 만드는 것이며 기능을 구현 반환형 함수명(매겨변수1, 매개변수2)