포인터 배열, 구조체

이윤설·2024년 6월 19일

흥달쌤 C언어 특강

목록 보기
7/10

포인터 배열

  • 포인터 배열: 배열의 요소가 포인터(메모리 주소)로 이루어진 것.

    이것은 여태 사용했던 배열의 형태다.
    0번째 값의 주소가 100번지라면, 배열 a[]의 주소값은 100번지이다.
    printf("%s\n", a);: %s는 주소값을 받는다. 따라서 100번지를 받아서 문자열을 출력한다. 그러면 배열의 모든 요소를 출력한다.

    "Hello"를 str에 저장하면 메모리 어딘가에 Hello가 저장된다.
    포인터 변수 str은 메모리의 주소값을 값으로 저장한다.
    printf("%s\n", a);: %s는 주소값을 받는다. 따라서 100번지를 받아서 문자열을 출력한다. 그러면 배열의 모든 요소를 출력한다.

이것은 포인터 배열이다.
따라서 각각의 인덱스에는 주소값이 들어간다.
마찬가지로 0번째 인덱스가 100번지라면 student 배열의 주소값도 100번지다.
각각의 요소에 20,30,40번지가 들어간다.
주의) 인덱스의 번지와 요소의 번지는 다르다. 헷갈리지 말기.



연산자 우선순위에 의해 (c+1)=101번지다.
101번지의 값은 30인데, %s, 즉 주소값의 값을 출력하면 "bbb"다.

구조체

  • 구조체란, 여러 변수들을 모아서, 하나의 객체를 만든 것이다.

일반 구조체

#include <stdio.h>

struct IceCream {
    char name[50];
    char flavor[50];
    int calories;
    float price;
    char manufactureDate[11]; // YYYY-MM-DD 형식
    char expirationDate[11];  // YYYY-MM-DD 형식
};

int main() {
    // 아이스크림 구조체 변수 선언 및 초기화
    struct IceCream chocoBanana = {
        "초코바나나",
        "초콜릿",
        150,
        3.50,
        "2024-06-17",
        "2025-06-17"
    };

    // 아이스크림 구조체 출력
    printf("아이스크림 이름: %s\n", chocoBanana.name);
    printf("아이스크림 맛: %s\n", chocoBanana.flavor);
    printf("칼로리: %d\n", chocoBanana.calories);
    printf("가격: %.2f\n", chocoBanana.price);
    printf("제조일자: %s\n", chocoBanana.manufactureDate);
    printf("유통기한: %s\n", chocoBanana.expirationDate);

    return 0;
}

익명 구조체

선언문을 생략하는 익명 구조체를 사용하면 코드의 길이를 줄일 수 있다.

#include <stdio.h>

int main() {
    // 익명 구조체 선언 및 변수 초기화
    struct {
        char name[50];
        char flavor[50];
        int calories;
        float price;
    } chocoBanana = {"초코바나나", "초콜릿", 150, 3.50};

    // 익명 구조체 변수 사용
    printf("아이스크림 이름: %s\n", chocoBanana.name);
    printf("아이스크림 맛: %s\n", chocoBanana.flavor);
    printf("칼로리: %d\n", chocoBanana.calories);
    printf("가격: %.2f\n", chocoBanana.price);

    return 0;
}

구조체 - 포인터에 담기

struct person 
{
  char *name;
  int age;
};
struct person *p;
p->name = "test_2";
p->age = 40;
printf("%s:%d", p-> name, p->age);

구조체를 포인터 변수에 담을 땐, 인스턴스의 변수를 대입할 때 .이 아닌 "->"를 사용한다.

배열 포인터

안나오니까 스킵

profile
화려한 외면이 아닌 단단한 내면

0개의 댓글