본문 바로가기

프로그래밍/C언어14

12. c언어 구조체 구조체 sims게임을 만들 때, 캐릭터에 대한 정보가 너무 많이 들어간다 따라서 원소의 크기가 제각각인 배열을 만들 수 있으면 ? 한사람에 대한 정보를 한개의 배열에 저장 할 수 있으면? 즉, 첫번째 원소는 int로 나이를, 두번째원소는 char[]로 이름을! 하지만 c언어에서 배열은 원소의 타입이 모두 동일해야 한다. 다행히도 c언어에서는 배열로 해결하지 못하는 문제를 구조체를 이용하여 해결할 수 있다. #include struct Human { int age; int height; int weight; }; int main(){ struct Human Psi; Psi.age=99; Psi.height=185; Psi.weight=80; printf("Psi information\n"); printf(.. 2023. 3. 22.
11. c언어 함수 함수 포맷 #include 리턴자료형 함수이름() { 메소드; return 0; } int main(){ 함수이름(); return 0; } int print_hello(){ printf("hello!"); return 0; } 함수 선언할 때 int : int형의 결과값을 반환한다는 뜻 - return 0 에 대하여 = 0이라는 데이터가 메모리상에 4바이트를 차지한다는 의미 함수 이름() : 함수이름뒤에 꼭 () 붙여주기 - 함수라는 뜻 int print_hello() 는 몸체 부분 main함수 안에서 print_hello()함수를 호출한다. (컴파일러에게 내가 변수가 아니라 함수를 호출한다는 뜻으로 ()를 꼭 붙여야 한다) 그러면 print_hello()함수가 실행되고, 반환값을 가지고 돌아온다. (.. 2023. 3. 20.
10. c언어 문자열, 문자열입력, 문자열배열, 리터럴 scanf()와 문자열입력 컴퓨터는 문자를 문자로 저장하지 않고, 숫자로 저장한다. 다만 우리가 읽을 때 문자로 읽느냐, 숫자로 읽느냐의 차이. 아스키코드의 값을 따라 문자로 저장하든, 숫자로 저장하든, 포맷에 따라 읽어준다. 즉 char형으로 문자를 저장해도 컴퓨터는 숫자로 저장하고, 우리가 읽고자하는 포맷 %d or %c에 따라 읽어준다. #include int main() { char a; scanf("%c",&a); printf("%c,%d",a,a); } 결과 d,100 하지만 모든나라의 문자를 숫자로 변환하면 아스키 코드 안에 다 담을 수 없다. 그래서 생긴 것이 유니코드. utf-8따위. 아래 내용과는 별 상관이 없다 문자열 입력 포맷 char str[]; scanf(“%s”,str); st.. 2023. 3. 20.
9. c언어 배열과 포인터 헷갈리는 부분.. 포인터 배열 배열을 가리키는 포인터 : int *parr=arr / int (*parr)[3]=arr parr[1] = arr[1] (*parr)[1] = arr[1] 2차원 배열 arr = 배열의 첫번째 인덱스의 주소값 arr[0] = arr[0][0]의 주소값 sizeof(arr[0]) : 행의 크기 —————————————————————1차원 배열과 같은 맥락 arr[x][y]의 주소값 원래 배열이 arr[a][b]라고 하면, arr[x][y]의 주소값은 arr + 4bx + 4y 2차원 배열을 가리키는 포인터를 통해서 원소들에 정확히 접근하기 위해서 1. 가리키는 원소의 크기(4) 2. b의 값 위 두 정보가 포인터의 타입에 명시되어 있어야 한다. 따라서 2차원 배열을 가리키는 포인터의 생김새는 .. 2023. 3. 16.
8-3. 배열을 가리키는 포인터(배열포인터) 기억하기 arr[i] 는 컴파일러에 의해 *(arr+i) 로 변환된다. 1차원 배열 가리키기 int* 포인터가 배열을 가리킬 수 있지 않을까? (배열의 원소가 int형일때!) 일단 이해 되지 않는 식을 써본다 #include int main() { int arr[3] = { 1,2,3 }; int* parr; parr = arr; printf("arr[1] : %d \n", arr[1]); printf("parr[1] : %d \n", parr[1]); return 0; } 결과는 다음과 같다 arr[1] : 2 parr[1] : 2 WHY? parr[1] = *(parr+1) 따라서 arr의 첫번째 원소의 주소값을 가진 parr포인터로 arr 배열의 원소에 접근이 가능하다. 포인터의 포인터 int a=.. 2023. 2. 16.
8-2. c언어 포인터의 덧셈과 뺄셈 포인터의 덧셈 먼저 기존의 포인터에 1을 더해본다 #include int main() { int a; int* pa; pa = &a; printf("pa's value : %p \n", pa); printf("pa+1 's value : %p \n", pa + 1); return 0; } 결과는 다음과 같다. pa's value : 0000009A1451FAB4 pa+1 's value : 0000009A1451FAB8 분명 pa에 1을 더했는데 결과는 4가 차이난다. 그 이유는, 포인터가 가리키는 변수의 자료형의 크기 (여기서 변수는 int형이기 때문에 4바이트라서 4가 더해진것)만큼 더해지기 때문이다. 즉, 포인터는 자신이 가리키는 데이터의 '자료형' 메모리의 크기를 곱한만큼 덧셈을 수행한다. 포인터.. 2023. 2. 16.