SW/C 9

17-1 구조체

구조체는 사용자가 만드는 자료형이다.#include struct student{ int num; double grade;};int main(){ struct student s1; s1.num=2; s1.grade=2.7; printf("학번 : %d\\n",s1.num); printf("학점 : %.1lf\\n",s1.grade); return 0;}구조체 변수의 크기패딩바이트를 넣어서 가지런하게 정렬(바이트 얼라인먼트)를 한다.구조체에 있는 변수중 가장 크기가 큰 변수를 기준으로 패딩비트를 채워넣는다.구조체포인터와 →연산자#include struct score{ int kor; int eng; int math;};int main(){ st..

SW/C 2025.03.30

13-2 함수의 데이터 공유 방법

값을 복사하여 전달하는 방법main: mov r0, #10 ; x 값을 r0에 저장 mov r1, #20 ; y 값을 r1에 저장 bl func ; 함수 호출 (r0, r1에 값 전달) bx lr ; 리턴func: add r0, r0, #1 ; a = a + 1 (r0 값을 변경) bx lr ; 리턴 (원래 함수로 복귀)메모리에 저장되어있는 값을 레지스터에 복사하고 이거를 인자로 보내는 것이므로 값을 복사하여 전달하는 방식인것이다.주소를 전달하는 방식void add_ten(int *pa);

SW/C 2025.03.30

12-1 문자열과 포인터

printf("%s", "apple");이렇게 쓸 경우 a,p,p,l,e에 해당되는 주소값이 각각 저장되고 마지막에 널값도 들어간다.apple은 배열에 저장되는 것이다.“”를 사용하여 문자열을 만들면 이것은 배열로 저장이 되는 것이다.따라서 이런 형식이 가능하다.char *dessert = "apple";dessert = "banana";띄어쓰기 포함해서 문자열에 저장하기gets(str);버퍼에는 개행이 그대로 들어가지만 배열에 저장될때 널문자로 바껴서 저장된다.따라서 다음상황에서 버퍼를 지워줘야함.scanf("%d",&age);gets(name);//scanf는 개행문자(화이트스페이스)를 제외하고 버퍼를 비운다. 근데 gets는 개행문자가 있으면 널문자로 바꾼다.scanf와 gets함수는 입력되는 문자..

SW/C 2025.03.30

11-2 버퍼를 사용하는 입력함수

scanf 특징화이트스페이스를 구분하여 작동한다.scnaf("%d%d",&a, &b);scanf("%d %d",&a,&b);둘은 다른거다!!중간에 화이트스페이스 개수만큼 허용하는 것이다.버퍼키보드에 입력하는 데이터는 일단 버퍼에 저장된 후 scanf함수에 의해 변수에 입력된다.#include int main(){ char ch; int i; for(int i=0;i이 예제는 문자를 입력하고 화면에 출력하는 과정을 세번 반복한다.그러나 실행 결과는 한 번의 키보드 입력으로 끝난다!!!→최초 scanf 함수가 호출될 때 키보드로 문자열을 입력하면 일단 버퍼에 저장한다. 버퍼에 남아있는것들을 우선적으로 채워넣고, 버퍼에 없을 경우 새로 입력받는다.따라서!!입력데이터를 하나 입력하고 엔터를 입력..

SW/C 2025.03.30

9-2 포인터 완전정복

주소와 포인터의 크기모든 주소와 포인터는 자료형에 관계 없이 크기가 같다.포인터의 대입 규칙포인터는 크기가 모두 같으므로 대입 연산을 쉽게 생각할 수 있다. 그런데 규칙이 있다.포인터는 가리키는 변수의 형태가 같을 때만 대입해야 한다.#include int main(){ int a = 10; int *p = &a; double *pd; pd = p; //더블형 포인터에 p의 주소값을 넣는중인데, 타입이 다르므로 오류난다. //why? 더블형 포인터라고 선언되면 8바이트를 읽어오는 것이다. //주소값의 크기는 동일하므로 들어갈때는 문제가 없지만, //이 포인터를 사용해서 실제 값을 불러올떄 문제가 됨. printf("%lf\\n",*pd); //pd는 8..

SW/C 2025.03.30

9-1 포인터

#include int main(){ int a; int *pa; pa = &a; *pa = 10; printf("포인터로 a값 출력 : %d\\n", *pa); printf("변수명으로 a값 출력 : %d\\n",a); return 0;}printf는 변수의 주소가 아니라 변수의 값을 필요로 하므로 이런식으로 접근한다.반면 scanf는 변수의 값이 아니라 변수의 주소를 필요로 하므로 이런식으로 한다.scanf("%d",&a);scanf("%d",pa);const를 사용한 포인터const를 사용하면 포인터가 가르키는 변수의 값을 바꿀 수 없다는 것이다.#include int main(){ int a=10, b=20; const int *pa = &a; ..

SW/C 2025.03.30

8-2 문자 저장하기

문자는 char형 배열에 저장한다.저장할 문자열의 길이보다 최소 하나 이상 크게 배열을 선언해야한다!!!!ex)apple → 요소갯수 6개로 해야함.(널문자 저장해야돼서)#include int main(){ char str[80] = "applejam"; /* | 'a' | 'p' | 'p' | 'l' | 'e' | 'j' | 'a' | 'm' | '\\0' | '\\0' | '\\0' | ... (총 80바이트) | 자동으로 널값이 저장된다. 남는 배열요소 값도 모두 널값으로 자동채워짐! */ printf("최초 문자열 : %s\\n",str); printf("문자열 입력 : "); scanf("%s",str); //여기서 입력 후 엔터를 치면 자동으로 널문..

SW/C 2025.03.30

8-1 배열

int arr[5] = {1, 2, 3, 4, 5};int *p = arr;printf("%lu\\n", sizeof(arr)); // 5 * sizeof(int) -> 20 (배열 전체 크기)printf("%lu\\n", sizeof(p)); // 포인터 크기 -> 4(32비트) 또는 8(64비트)배열의 이름은 자체로 배열의 첫번째 요소의 주소이다.int arr[5] = {1, 2, 3, 4, 5};printf("%p\\n", arr); // 첫 번째 요소의 주소 출력printf("%p\\n", &arr[0]); // 위와 동일한 주소 출력배열이름이 함수인자로 들어갈때!!void func(int arr[]) { // int arr[]는 int *arr와 동일하게 해석됨 printf("%l..

SW/C 2025.03.30