c14주차

2025. 5. 28. 17:35·c프로그래밍/예습
반응형

배열

int a // int형 a 선언 
a = 1;
printf("%d",a); // a값 1 출력 
int z[3]; //z라는 이름의 배열 방은 0 , 1, 2 총 3
y[0] = 1; //인덱스는 0부터 시작 첫번째(0)의 방에 1
y[1] = 2; // 두번째 [1] 의 방에 2
y[2] = 3; // 세번째 y[2] 의 방에 3 넣어줌 


return 0;

[3] 이라고해서 [0]~[3] 이 아니다

2까지만 있는데 방이 3개니까 0 1 2 3 하면 4개가 되므로 절대 안된다.

 

int y[3] = {1,2,3}; 이런식으로 배열을 초기화 해주면 된다

방이 3개인데 하나 만 초기화 할 수 도 있는데

{1} 만 적으면 된다

근데 하나만 초기화 하면 뒤에 오는 나머지 방들은 0이 들어가게 된다.

 

char 형으로도 작성이  가능하다

 

char z[3] = {'a','b','\0'} //마지막은 null문자

이렇게 초기화가 가능하다

null을 넣는 이유는 나중에 복사할 때 문제가 생길 여지가 있어서 null 문자를 꼭 넣어줘야한다.

또는

char z[3] = "ab"; // 1번째방 a 2번째방 b 3번째만 x 없음

쌍따옴표를 사용해서 순서대로 넣어줄 수 있다 마지막은 \0 이 자동으로 들어가게 되어 이런 방식으로 사용하는것이 좋다

 

아니면

char z[3];

z[0] = 'a';
z[1] = 'b';
z[2] = 'c';

이렇게 문자 리터럴을 넣어줄 수 있다.

 

포인터

cpu와 메모리가 어드레스 버스 콘트롤 버스를 왕복하는 동작을 한다

포인터는 Adress bus (메모리 주소)를 가지고 놀게된다

 관리는 OS가 해준다

 

포인터를 이용하면 기계어나 어셈블리 언처럼 메모리의 주소를 이용해 메모리의 내용을 직접 접근 할 수 있다

 

 

int sum = 0;

변수를 초기화하면서 선언하면 인트형이므로 4바이트 메모리 공간이 확보되고 초기값으로 0이 할당된다

sum 변수가 실제로 할당된 메모리의 주소를 알고 싶다면 &연산자를 사용하여 &sum 이라고 하면 변수가 기억되어 있는 메모리 번지를 알 수 있다

메모리의 주소를 저장하려면 일반 변수가 아닌 포인터를 사용한다

포인터라고만해도 되짐나 주소를 저장하는 변수이므로 포인터 변수라고 한다

 

 

포인터 선언

 

int a; //일반 변수
int *a; //포인터 변수 선언
int* pa; //포인터 pa의 선언
int *pa,b; //pa만 포인터

 

참조 연산자

포인터에 주소를 대입하는 방법

 - int x = 10; //일반 변수 x의 선언과 초기화

 - int *px; // 포인터 변수 px선언

 - px = &x; // 포인터 px에 변수 x의 주소 대입

 

px에 주소가 들어있고 값을 가져오는 방법은

y = *px; 이렇게 별을 찍어주면 된다.

곱하기 연산자와 순위는 같지만 우선순위가 높다 

 

#include <stdio.h>

int main() {
    int a = 1;
    // int *pa; //포인터 변수
    // int *pa = 100 <-임의로 주소를 사용하면 에러나옴
    int *pa = &a;// <- 이렇게 사용해줘야한다

    printf("%d %p",a, &a);
}
#include <stdio.h>

int main() {

    int a=1,b;
    int *pa=&a; //구두점 
    //pa = &a;
    y = *pa; //연산자 선언문의 * 과 실행문의 *은 다르다
    printf("%d %p %d",a,&a,b);

    return 0;
}

복잡하게 만든것인데

px에 x 의 주소를 y에 px 주소를 넣어주는것이다.

주소로 가서 값을 가져오라는 뜻이다

 

일반변수는 그냥 대입해서 사용하면 되고

포인터는 항상별표를 붙여서 사용해주면 된다.

 

포인터 실습 코드 작성

#include <stdio.h>

int main() {
 

    int a; // 정수 a 선언 
    a = 1; //1로 초기화 
    // int *pa; // 포인터 pa 선언 하지만 가르키는 주소가 없으므로 문제가 생긴다
    int *pa = &x; // 선언과 동시에 주소를 초기화 시켜주는 방법 
    
   
     
    printf("%d \n",x);
    printf("%p\n",pa); //포인터가 있는 주소 출력
    printf("%d",*pa); //포인터의 주소에 존재하는 값을 출력하는 것이다 정수형을 출력해야해서 %d
    

    
    return 0;
}

 

 

px = &x; //포인터 px에 x의 주소를 대입
y = *px; // 실행문 px의 주소로 가서 값을 가져온다

쉽게 이해해보기

& 주소

* 값

scanf에서 &을 사용하는이유는 변수의 주소를 scanf 함수에 전달해  scanf가 그 주소에 값을 저장하기 위함이다

 

포인터 변수의 자료형

 

int *pi

 - 변수 pi 가 int 형 데이터를 참조하기 위한 포인터 변수

 - pi가 지시하는 곳의 자료형이 int 형

 

char *pc;

 - 변수 pc가 char형 데이터를 참조하기 위한 포인터 변수

 - pc가 지시하는 곳의 자료형이 char형

 

 

char형 포인터와 문자열

  • 문자열은 두 개 이상의 문자 묶음으로 char형 배열에 저장
    • char ch[4] = "ABC";
  • char 형 포인터를 사용할 수도 있음
    • char *ch="ABC";
    • ch는 char형 포인터로 선언
    • ch에는 문자A가 저장되는 메모리 주소가 배정됨

 

구조체 struct

  • 변수
    • 단독주택
    • int x; //4바이트
  • 배열
    • 같은 평수로 구성된 아파트
    • int x[5]; //4평짜리 5가구
  • 구조체(변수/배열/구주체들의 모임)
    • 다른 형 (type)의 데이터들을 하나의 단위로 취급 

 

#include <stdio.h>


struct human{ //구조체 작성 
    int age;	
    double weight;
};

int main() {
    struct human kim; // int a = kim 이런 방식 
    kim.age=25;	// kim은 human 이고 human 안에 .age를 kim에 저장하는것 
    printf("%d\n",kim.age); //출력은 정수형으로 나온다 
    return 0;
}

struct 이름 {} ; < - 세미콜론 꼭 써줘야한다..

 

#include <stdio.h>

struct score {
    char no[10];
    char name[10];
    int his, math, tot;
    double avg;
}; //<- 세미콜론 꼭 

int main() {
    struct score sc = {"20000000", "kim", 90, 91}; // 세미콜론 추가해줘야함 
    //배열처럼 순서대로 no,name his math에 저장되고 tot는 안넣어줬으니 0으로 초기화됨 
    
    // tot과 avg 계산
    sc.tot = sc.his + sc.math;  // tot은 his, math의 합
    sc.avg = sc.tot / 2.0;     // avg는 tot / 2.0 (double로 계산)
    
    // 출력
    printf("%s %s %d %d %d %lf\n", sc.no sc.name, sc.his, sc.math, sc.tot, sc.avg);

    return 0;
}

 

구조체 대입연산 

 

#include <stdio.h>

struct score {
    char no[10];
    char name[10];
    int math, his, total;
    double avg;
}; // <- 세미콜론 꼭 작성 

int main() {
    struct score a,b = {"20000000", "kim", 90, 91}; // 세미콜론 추가
    //sc에 {} 안의 값을 넣은것이며 a 는 비어있는 상태 
    
    // total과 avg 계산
    sc.total = sc.his + sc.math;  // total은 his와 math의 합
    sc.avg = sc.total / 2.0;     // avg는 total / 2.0 (double로 계산)

    a=b; //<= a에 b를 넣어줌 
    
    // 출력
    printf("%s %s %d %d %d %lf\n", b.no, b.name, b.his, b.math, b.total, b.avg);
    printf("%s %s %d %d %d %lf\n", a.no, a.name, a.his, a.math, a.total, a.avg);
   	//결국 출력하면 a= sc; 이 문장 덕분에 복제가 된 결과를 확인가능하다 

    return 0;
}

구조체를 복사하는 느낌처럼 사용이 가능하다

하나하나 복사할 필요 없이 한꺼번에 복사가 된다.

 

 

실습 2 코드작성 

#include <stdio.h>

struct  A_bmi { //구조체 작성
    float weight;
    float height;
    float bmi;
    
}; // <- 세미콜론 작성 

int main() {
    // struct A_bmi A; A라는 이름으로 구조체 A_bmi를 선언 
    // A.weight = 60; // 60을 A_bmi weight에 넣기 
    // A.height = 180; // 180을 똑같이 height에 넣기 
    // A.bmi = A.weight/(A.height * A.height); // A. 이렇게도 평균을 구하는게 가능 float형 이기 떄문
    //또는
    struct A_bmi B,A = {60,180}; //A에 값 넣기 마지막은 0으로 초기화됨 
    A.bmi = A.weight / (A.height * A.height); // BMI 계산 공식

    //여기서 B에 바로 복제하는방법
    B = A; //B를 선언과 동시에 A의 값을 B에 투입 

    printf("키는 %lf 몸무게는%lf BMI지수는 %lf 입니다.\n",A.height,A.weight,A.bmi);
    printf("키는 %lf 몸무게는%lf BMI지수는 %lf 입니다.",B.height,B.weight,B.bmi);// 위에 식을 안쓰고도 복제 성공
    

    return 0;
}
반응형

'c프로그래밍 > 예습' 카테고리의 다른 글

C언어 10주차 제어문  (0) 2025.05.10
C연산자  (0) 2025.04.18
C언어 6주차 예습  (0) 2025.04.10
C언어 5주차 예습  (0) 2025.04.04
C언어 4주차 예습  (1) 2025.03.29
'c프로그래밍/예습' 카테고리의 다른 글
  • C언어 10주차 제어문
  • C연산자
  • C언어 6주차 예습
  • C언어 5주차 예습
NetStat
NetStat
netstats 님의 블로그 입니다.
  • NetStat
    NetStats
    NetStat
  • 전체
    오늘
    어제
    • 분류 전체보기 (33) N
      • JAVA (0)
      • SQL (0)
      • c프로그래밍 (16)
        • 예습 (8)
        • Class (6)
      • 파이썬 (4)
        • 기초 (4)
      • 환경설정 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    printf
    실수형
    For문
    c언어
    비쥬얼 스튜디오 설치
    캐스팅
    M1
    else
    열거형
    C
    파이썬 연산
    연산자
    이스케이프 시퀀스
    매개변수
    parameter
    python3
    문자형
    식별자
    elif
    파이썬
    리턴
    파이썬 기초
    Python
    dl emfd
    escape sequence
    argument
    C언어 기초
    정수형
    sacnf
    vscode
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
NetStat
c14주차
상단으로

티스토리툴바